以下代码会导致SIGSEGV,但仅在调试时会产生。
#include <stdio.h>
#include <stdlib.h>
typedef struct enemy_desc
{
int type;
int x;
int y;
}enemy;
int main()
{
enemy **enemies;
enemies=(enemy **)malloc(sizeof(enemy *)*16);
enemies[0]->type=23;
printf("%i",enemies[0]->type);
return 0;
}
最佳答案
您已为16个enemy *
指针分配了内存,但尚未为16个enemy
结构本身分配空间。有两种方法可以解决此问题。一种是添加一个循环,该循环逐个分配16个enemy
结构中的每个结构:
int main()
{
enemy **enemies;
int i;
enemies = (enemy **) malloc(sizeof(enemy *) * 16);
for (i = 0; i < 16; ++i) {
enemies[i] = (enemy *) malloc(sizeof(enemy));
}
enemies[0]->type = 23;
printf("%i",enemies[0]->type);
return 0;
}
另一个是删除一个间接级别。如果声明
enemy *enemies
,则可以一次分配16个结构并放弃循环。如果不需要双重间接访问,这将是我的首选解决方案:int main()
{
enemy *enemies;
enemies = (enemy *) malloc(sizeof(enemy) * 16);
enemies[0].type=23;
printf("%i",enemies[0].type);
return 0;
}
请注意,
->
运算符切换到.
。关于c - 调试时仅指向SIGSEGV的struct的指针数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3503688/