struct中指向int指针数组的指针如何赋值及访问内部int元素?
修复方案
两个核心错误
struct demo *demo_ptr是未初始化的野指针,没有指向有效的内存空间,直接用->访问成员属于非法内存操作,是程序崩溃的主要原因。- 元素访问语法错误:
demo_ptr->(*p)[i]不符合C语言语法规则,成员访问和解引用的顺序错误。
修正后完整代码
#include <stdio.h> #include <stdlib.h> struct demo{ int *(*p)[]; }; int main() { // 优先用栈上的结构体实例,无需手动管理内存 struct demo d; // 如果必须用指针,先分配内存:struct demo *demo_ptr = malloc(sizeof(struct demo)); int a = 1; int b = 2; int *arr[2]; arr[0] = &a; arr[1] = &b; for (int i = 0; i < 2; i++) { printf("num in array = %d\n", *arr[i]); } // 赋值逻辑本身正确,只要结构体有有效内存即可 d.p = &arr; // 指针写法:demo_ptr->p = &arr; for(int i = 0; i < 2; i++){ // 正确访问写法 printf("num in array = %d\n", *(*d.p)[i]); // 指针写法:*(*(demo_ptr->p))[i] } // 用malloc分配的指针需要手动释放:free(demo_ptr); return 0; }
操作说明
赋值方法
你原本给p赋值的逻辑是对的,&arr就是int*类型数组的指针,和p的类型完全匹配,只需要保证存储p的struct demo实例有有效的内存空间:
- 直接在栈上声明
struct demo变量,不需要手动分配、释放内存,更安全 - 如果要使用指针形式,必须先调用
malloc分配对应大小的内存,使用完成后调用free释放,避免内存泄漏
元素访问方法
按优先级拆解访问逻辑:
- 先拿到结构体里的
p成员:d.p(指针形式写demo_ptr->p),此时拿到的是指向int*数组的指针 - 对
p解引用拿到数组本身:*(d.p),等价于你定义的arr数组 - 取下标拿到对应位置的
int*指针:(*d.p)[i] - 对
int*解引用拿到最终的int值:*(*d.p)[i]
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

