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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - 分段故障(核心转储)相关的知识,希望对你有一定的参考价值。

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

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
", i);
     }

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

答案
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处理错误并继续。

另一答案

你想要的

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

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

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

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

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

以上是关于C - 分段故障(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

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

分段故障核心转储...?

Centos docker容器因6分段故障而崩溃 - 这是核心转储

python OpenCV分段故障(核心转储)

分段故障核心转储在 Hermite 中

使用嵌套在向量中的向量转储的分段故障核心