以下代码会导致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/

10-11 17:03