C 错误:取消区分越界指针
给出下面的代码,我在运行时得到以下错误 致命运行时错误:第21行第11列,线程id 0x00002068:C 错误:取消区分越界指针,c,C,给出下面的代码,我在运行时得到以下错误 致命运行时错误:第21行第11列,线程id 0x00002068: 取消对越界指针的引用:超出指针末尾1个字节(1个元素) 数组 我做错了什么?我创建了一个2D字符数组,并将所有元素初始化为“x”。然后,我尝试使用指针逻辑打印所有元素。它将字符打印到标准IO,但随后抛出运行时错误。我看不出越界发生在哪里 #include <stdio.h> #define EDGE 10 int main(void){ char fabric[ED
取消对越界指针的引用:超出指针末尾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;
}
#包括
#定义边缘10
内部主(空){
炭织物[边缘][边缘];
字符*单元=织物;
int totalCells=边*边;
对于(inti=0;i
首先,数组不包含字符串。所以这个条件
while(*cell){
导致未定义的行为
您还必须在声明和语句中强制转换指针
char *cell = ( char * )fabric;
cell = ( char * )fabric;
因为没有从类型
char(*)[EDGE]
到类型char*
的隐式转换,所以强烈建议您只需malloc/memset您的结构,而不必执行hacky指针操作
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define EDGE ( 10 )
#define TOTAL_CELLS ( EDGE * EDGE )
int main()
{
int i;
char * fabric = malloc(TOTAL_CELLS);
memset(fabric,'x',TOTAL_CELLS);
for(i=0; i<TOTAL_CELLS; i++){
printf("%c",fabric[i]);
}
return 0;
}
#包括
#包括
#包括
#定义边(10)
#定义总单元格(边*边)
int main()
{
int i;
char*fabric=malloc(总单元);
膜组(织物,'x',总单元);
对于(i=0;ichar*cell=fabric;
是一个错误,如果没有看到错误消息,请调整编译器设置,直到看到为止。while(*cell)//当地址中有内容时,注释是错误的。当单元格指向非零字节时,注释应该是错误的。如果结构中没有零字节,则超出范围。当单元格[i]时,不要使用*(cell+i)=…
=…
是等效的,并且更容易阅读。不过,在您的例子中,您有一个二维数组,所以您应该引用fabric[i][j]
。如果数组表示法导致堆栈溢出,则从算法角度看,这是错误的。您不需要使用指针。指针只会使事情复杂化。1000个条目微不足道。对于运行时系统可以生成此诊断的编译器,假设您可以寻址数组[][]是相当危险的就好像它是一个大数组[]wad。您可能会覆盖诊断用于检测溢出的有意保护空间。请确保用其名称标记有关此编译器的问题,如[labwindows]@tadman此声明char*cell=&fabric;完全不正确。