C自定义结构体int指针指向二维数组解引用报错问题求解
错误核心原因
你遇到的编译错误:
invalid type argument of unary ‘*’ (have ‘int’)
触发的直接原因是类型不匹配,分为两层问题:
- 二维数组的指针类型和结构体
arr成员类型不匹配
C语言中int adjm[3][3]是二维数组,数组名adjm退化为指针时,类型是int (*)[3](指向长度为3的int数组的指针),而你结构体中声明的arr是int *(指向单个int的指针),二者类型不兼容,赋值时本身就存在隐式类型转换的隐患。 - 解引用逻辑错误
你写的*(*(g1.arr +1)+2)执行顺序是:
g1.arr是int*类型,g1.arr +1的偏移量是1个int长度,解引用后得到的是int类型的数值- 你后续又对这个
int数值做*(数值+2)操作,*运算符只能作用于指针类型,自然触发类型错误。
修复方案
方案1:修改结构体成员类型匹配二维数组
将结构体中arr的类型修改为int (*)[3](指向长度为3的int数组的指针),和二维数组退化后的指针类型匹配,原有解引用逻辑可以正常生效:
typedef struct Graph{ int n; int (*arr)[3]; // 修改为指向长度为3的int数组的指针 } G; int main(){ // 标准C写法建议用int main而非void main G g1; int adjm[3][3]={{1,1,2},{4,5,6},{3,0,0}}; g1.arr = adjm; printf(" %d",*(*(g1.arr +1)+2)); // 输出结果为6,对应adjm[1][2] return 0; }
方案2:保留int*类型,按一维数组偏移访问
如果需要保留结构体中arr为int*的设计,赋值时需要将二维数组转换为一级int指针,访问时按行宽计算偏移量即可:
typedef struct Graph{ int n; int* arr; } G; int main(){ G g1; int adjm[3][3]={{1,1,2},{4,5,6},{3,0,0}}; g1.arr = &adjm[0][0]; // 取二维数组首元素的地址,类型为int* // 访问第i行第j列的公式:*(arr + i * 列数 + j) printf(" %d",*(g1.arr + 1*3 + 2)); // 输出结果为6,对应adjm[1][2] return 0; }
扩展提示
如果要实现通用长度的邻接矩阵,不建议固定列宽为3,可以在确定矩阵边长n后,为arr动态分配一维内存:g1.arr = malloc(n * n * sizeof(int)),后续访问统一按*(arr + i*n +j)的逻辑操作即可。
内容的提问来源于stack exchange,提问作者VKD01
相关产品推荐
相关产品推荐

