【发布时间】:2021-09-17 22:50:45
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int a[4][5] =
{
{1,1,0,1,0},
{0,0,0,0,0},
{0,1,0,0,0},
{1,0,1,1,0}
};
int *ptr = &a[0][0];
for (; ptr < ptr+19; ptr++)
{
printf("%d ", *ptr);
}
return 0;
}
为什么这段代码不起作用?据我所知,二维数组以行主要顺序存储,如下所示:
[1,1,0,1,0]-[0,0,0,0,0]-[0,1,0,0,0]-[1,0,1,1,0]
所以如果我从 &a[0][0] 开始并每次将其递增 1 直到它递增到最后一个元素,为什么这不起作用?
【问题讨论】:
-
ptr总是小于ptr+19,至少在指针跑出地址空间的末尾并回绕之前,但它很可能在此之前指向无效内存。 -
“不起作用”不是一个有用的陈述。 做什么它做什么?
-
除了明显的错误
ptr < ptr+19之外,不允许您以这种方式取消引用数组。您超出了数组访问的范围,这是未定义的行为。允许编译器发疯并生成奇怪的代码或崩溃的程序。
标签: c for-loop pointers multidimensional-array casting