int main ()
{
int arr[10][1];
arr[1][0]=44;
arr[0][1]=55;
printf("%i",arr[1][0]);
return 0;
}
是否打印出“55”或“44”???
答案 0 :(得分:4)
没有arr[0][1]
这样的元素 - 就像没有元素arr[10][0]
一样 - 数组索引基于零。
如果您声明:
int arr[10][2];
您的代码将按预期工作。
声明
int arr[10][1];
当您访问arr[0][1]
时,您正在第一个数组“行”的末尾访问。未选中C中的内存访问权限,因此您的访问权限将存储在arr[1][0]
的元素别名。
如果交换了两个赋值语句的顺序,您会看到显示的值取决于这两个赋值的顺序。后面的赋值会覆盖先前赋值的值。即:
int main ()
{
int arr[10][1];
arr[0][1]=55;
arr[1][0]=44;
printf("%i",arr[1][0]);
return 0;
}
...将打印44,因为这将是写入内存中该int大小点的最终值。
编辑:因为我们有很多人在这里发表评论,声称将糟糕的C99标准解释为宣称你所调用的行为是“未定义的行为”......考虑下面的代码与上面的代码相同,因为第6.5.2.1节:int main(int argc, char *argv[])
{
int arr[10][1];
arr[1][0] = 44;
arr[0][1] = 55;
printf("Value is: %d\n", 0[arr][1]);
return 0;
}
在一个链接的问题中,声称由于对齐问题,C编译器可能会选择填充数组“行”之间的空格。那就是虚假信息;没有C标准说这是可能的。
答案 1 :(得分:1)
不,他们不一样。您声明了一个包含十个数组的数组,每个数组都有一个整数元素arr[0][1]
大于数组索引,因此应该是错误。结果应该是44。