C 错误:取消区分越界指针

C 错误:取消区分越界指针,c,C,给出下面的代码,我在运行时得到以下错误 致命运行时错误:第21行第11列,线程id 0x00002068: 取消对越界指针的引用:超出指针末尾1个字节(1个元素) 数组 我做错了什么?我创建了一个2D字符数组,并将所有元素初始化为“x”。然后,我尝试使用指针逻辑打印所有元素。它将字符打印到标准IO,但随后抛出运行时错误。我看不出越界发生在哪里 #include <stdio.h> #define EDGE 10 int main(void){ char fabric[ED

给出下面的代码,我在运行时得到以下错误

致命运行时错误:第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;

}
#包括
#定义边缘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;i
char*cell=fabric;
是一个错误,如果没有看到错误消息,请调整编译器设置,直到看到为止。
while(*cell)//当地址中有内容时,注释是错误的。当单元格指向非零字节时,注释应该是错误的。如果
结构中没有零字节,则超出范围。当
单元格[i]时,不要使用
*(cell+i)=…
=…
是等效的,并且更容易阅读。不过,在您的例子中,您有一个二维数组,所以您应该引用
fabric[i][j]
。如果数组表示法导致堆栈溢出,则从算法角度看,这是错误的。您不需要使用指针。指针只会使事情复杂化。1000个条目微不足道。对于运行时系统可以生成此诊断的编译器,假设您可以寻址数组[][]是相当危险的就好像它是一个大数组[]wad。您可能会覆盖诊断用于检测溢出的有意保护空间。请确保用其名称标记有关此编译器的问题,如[labwindows]@tadman此声明char*cell=&fabric;完全不正确。