C - 分段故障(核心转储)

问题描述 投票:0回答:2

我正在制作一个可以旋转它的行和列的魔方。我的结构是这样的:

typedef struct
{
int **cell;
}face;

在这部分我将为细胞分配内存。 (X是用户输入)

face faceOne; //There are six of this faces
faceOne.cell = (int **)malloc(x * sizeof(int));
for(int i = 0; i < x; i++)
     faceOne.cell[i] = (int *)malloc(x * sizeof(int));

然后我填写这些细胞:

for (int i = 0; i <  x; i++)
  for (int j = 0; j < x; j++)
     {
     faceOne.cell[i][j] = 0;
     printf("%d\n", i);
     }

如果x大于3,则程序崩溃并出现Segmentation fault。我怎么解决这个问题?

c segmentation-fault
2个回答
2
投票
faceOne.cell = (int **)malloc(x * sizeof(int));

将会

faceOne.cell = malloc(x * sizeof(int*));

否则,您将为x int变量分配内存,然后在其上存储int*变量。如果sizeof(int) = sizeof(int*)然后它不会有任何问题,但在系统不是这种情况下,你已经为yoruself赢得了一个未定义的行为。

要在使用**时摆脱所有这些malloc,最好是这样做

faceOne.cell = malloc(x * sizeof *faceOne.cell);

同样的,

faceOne.cell[i] = malloc(x * sizeof *faceOne.cell[i] );

并且也没有施放malloc的返回值。这抑制了编译器生成的许多警告,并且是不必要的。

除了这一切,你有没有想过如果malloc失败并返回NULL会发生什么?然后你正在研究NULL并取消引用它(未定义的行为)。检查malloc的返回值,以防它返回NULL处理错误并继续。


0
投票

你想要的

faceOne.cell = (int **)malloc(x * sizeof(int));

x指针分配给int,所以这应该是

faceOne.cell = malloc(x * sizeof(int *));

在您的系统上,指针的大小(对于int)大于int的大小...

同样在C中不要转换malloc()(see this

© www.soinside.com 2019 - 2024. All rights reserved.