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
相关产品推荐
相关产品推荐

