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

typedef定义的adjmat二维数组赋值报错:Array type不可赋值,如何解决?

问题根源与解决办法

首先咱们得先理清你代码里的类型问题——你对typedef的用法理解有点偏差,导致声明出的数组不是你预期的样子:

1. 你的声明哪里错了?

你定义了:

#define N 11
typedef char adjmat[N][N];

这里adjmat已经是二维数组类型了,它等价于char[11][11]。但你在main里写了:

adjmat mat[N][N];

这相当于声明了一个四维数组:char mat[11][11][11][11]!因为你是用adjmat这个二维数组类型,再去定义一个N×N的数组,层层嵌套下来就变成四维了。

这就是为什么你执行mat[i][j] = ...会报错——此时mat[i][j]是一个char[11][11]的二维数组,而C语言里数组类型是不能直接被赋值的,所以编译器提示“Array type 'adjmat' is not assignable”。

2. 正确的声明方式

如果你想要的是一个N×N的二维数组,直接用adjmat类型声明变量即可:

adjmat mat;

这样mat就是标准的char[11][11]二维数组,和你直接写char mat[N][N];完全等价。

3. 如何正确赋值元素?

修正声明后,你就可以像普通二维数组一样给单个元素赋值了:

// 遍历赋值示例
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        mat[i][j] = getchar() - '0';
        // 注意:如果输入有空格/换行,记得先过滤掉无关字符
        // 比如可以加个getchar()跳过换行,或者用scanf("%d", &val)更稳妥
    }
}

额外提示:初始化的巧合

你之前能通过adjmat mat[N][N] = {{1,1,1},{0,0,0}};完成初始化,其实是因为C语言允许对多维数组的初始值做隐式截断,但这并不代表你的声明是正确的——初始化时编译器只填充了最外层数组的前几个元素,剩下的会被自动初始化为0,但实际mat的维度是四维,这和你想要的二维数组完全不是一回事。

内容的提问来源于stack exchange,提问作者avivgood2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:47:37