错误:取消引用超出范围的指针

时间:2019-05-30 15:14:25

标签: c

鉴于以下代码,我在运行时遇到以下错误

  

致命运行时错误:第21行,第11行,线程ID 0x00002068:
  越界指针的解除引用:末尾超出1个字节(1个元素)   数组。

我在这里做错了什么?我创建一个2D char数组并将所有元素初始化为'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;

}

2 个答案:

答案 0 :(得分:1)

强烈建议您仅对结构进行malloc / memset,而不要进行棘手的指针操作。

#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;
}

如果您仍然想引用类似2D数组的结构(fabric[i][j]),则可以在1D数组中轻松进行操作(fabric[i*EDGE+j]),并且更容易操作线性内存

答案 1 :(得分:0)

首先,数组不包含字符串。所以这种情况

while(*cell){ 

导致不确定的行为。

此外,您还必须在声明和语句中强制转换指针

char *cell = ( char * )fabric;

cell = ( char * )fabric;

因为没有从类型char ( * )[EDGE]到类型char *的隐式转换。