【发布时间】:2019-05-31 00:02:25
【问题描述】:
鉴于以下代码,我在运行时收到以下错误
致命的运行时错误:第 21 行,第 11 列,线程 id 0x00002068:
越界指针的取消引用:1 个字节(1 个元素)超过 数组。
我在这里做错了什么?我创建了一个 2D 字符数组并将所有元素初始化为“x”。然后我尝试使用指针逻辑打印所有元素。它将字符打印到标准 IO,但随后引发运行时错误。我没有看到越界发生在哪里。
#include <stdio.h>
#define EDGE 10
int main(void){
char fabric[EDGE][EDGE];
char *cell = fabric;
int totalCells = EDGE*EDGE;
for(int i = 0; i < totalCells; ++i){
*(cell + i) = 'x';
}
cell = fabric; //set cell to point back to first element
while(*cell){ //while there is content at address, print content
printf("%c", *cell);
++cell;
}
getchar();
return 0;
}
【问题讨论】:
-
char *cell = fabric;是一个错误,如果您没有看到错误消息,请调整您的编译器设置,直到看到为止。 -
while(*cell) //while there is content at address评论错误。应该是// while cell points to a non-zero byte。如果fabric中没有零字节,则超出范围。 -
当
cell[i] = ...等效且更易于阅读时,不要使用*(cell + i) = ...。但是,在您的情况下,您有一个 二维数组,因此您应该引用fabric[i][j]. -
如果数组表示法导致堆栈溢出,从算法的角度来看,你做错了。您不需要使用指针。指针只会使事情复杂化。 1000 个条目是微不足道的。
-
对于那种运行时系统可以生成这种诊断的编译器,假设您可以像处理一个大数组[] wad 一样处理数组[][] 是非常冒险的。您可能会覆盖诊断用来检测溢出的故意保护空间。请务必使用名称标记有关此编译器的问题,例如 [labwindows]
标签: c