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 - 分段故障(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章