鉴于以下代码,我在运行时遇到以下错误
致命运行时错误:第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;
}
答案 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 *
的隐式转换。