在执行以下代码时:
int main()
{
int abc[3][3]={0};
for(int *ip=&abc[0][0];ip<=&abc[3][3];ip++)
{
printf("%d \n",*ip);
}
}
预期结果为9个零,但显示12个数据。可能是什么原因?
答案 0 :(得分:2)
如果您查看3x3阵列的内存布局,则它看起来像:
[0][0] [1][0] [2][0]
+----+----+----+----+----+----+----+----+----+
| | | | | | | | | |
+----+----+----+----+----+----+----+----+----+
元素[3][3]
在哪里?
[0][0] [1][0] [2][0] [3][0] [3][3]
+----+----+----+----+----+----+----+----+----+----+----+----+----+
| | | | | | | | | | | | | |
+----+----+----+----+----+----+----+----+----+----+----+----+----+
这说明了为什么最终要访问12个元素。
您的代码因访问超出有效索引的行为而受到不确定的行为,但这是另一个问题。
您可以使用:
for (int *ip = &abc[0][0]; ip <= &abc[2][2]; ip++)
{
printf("%d \n",*ip);
}
但是,最好将2D数组作为2D数组来访问。
for (size_t i = 0; i < 3; ++i )
{
for (size_t j = 0; j < 3; ++j )
{
printf("%d \n", abc[i][j]);
}
}