You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C自定义结构体int指针指向二维数组解引用报错问题求解

错误核心原因

你遇到的编译错误:

invalid type argument of unary ‘*’ (have ‘int’)

触发的直接原因是类型不匹配,分为两层问题:

  1. 二维数组的指针类型和结构体arr成员类型不匹配
    C语言中int adjm[3][3]是二维数组,数组名adjm退化为指针时,类型是int (*)[3](指向长度为3的int数组的指针),而你结构体中声明的arr是int *(指向单个int的指针),二者类型不兼容,赋值时本身就存在隐式类型转换的隐患。
  2. 解引用逻辑错误
    你写的*(*(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:09:00