我想打印包含在多维数组中的值,我知道如果我们写像arr[3][4]这样的东西,那么arr[0]就是指向那个多维数组中第一个元素的指针。我想问一下,为什么在程序打印多维数组中包含的数字后,这段代码会给我无用的值?
代码如下:
#include <stdio.h>
#define ROW 3
#define COLL 4
int main(void) {
int arr[ROW][COLL]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
int *ptr;
for(ptr=arr[0];ptr<arr[ROW]+COLL;ptr++){
printf("%d ",*ptr);
}
printf("\n");
return 0;
}这是我编译上述代码时的结果:
1 2 3 4 5 6 7 8 9 10 11 12 -1079481492 134513936 0 -1079481352 但在将for循环更改为以下内容之后:
for(ptr=arr[0];ptr<=arr[ROW-1]+COLL-1;ptr++)代码工作并给出包含在多维数组中的确切数字。
发布于 2014-04-23 21:36:53
因为arr[ROW]是一种越界访问。arr中的最后一个有效位置是arr[ROW-1]。因此,代码的第一个版本会调用未定义的行为。
发布于 2014-04-23 21:38:59
指向最后一个元素的指针是
arr[ROW-1] + COLL - 1所以你的循环应该是
for (ptr = arr; ptr < arr[ROW-1] + COLL; ptr++) {发布于 2014-04-23 22:27:19
数组的元素是从0开始索引的,所以矩阵中的最后一个元素是arr[ROW-1][COLL-1]。
当指针到达arr[2] + COLL时,就没有这样的元素了,因为最后一行的最后一个元素的第二个坐标是[COLL-1]。
数组的元素存储在1D中,因此arr[0] + 4实际上是arr[1][0]。当您递增ptr++时,它会告诉编译器访问当前之后的下一个内存位置。所以,当ptr指向a[0] + 4时,它是有效的,因为编译器访问了a[0][0]之后的第五个值,这实际上是下一行的第一个值,arr[1][0],因为它们的内存位置是相邻的。
当您的ptr指向arr[4] + i, i = 0, 1, 2, 3时,您会得到错误的输出,因为这些元素不在您的数组中。
https://stackoverflow.com/questions/23245921
复制相似问题