C - Seg。指针数组出错

时间:2018-01-19 23:04:49

标签: c arrays pointers segmentation-fault

我正在用C做一个学校项目,我需要做的是创建一个代理的2D网格,其中一些是人类,其他人是僵尸。人类逃离僵尸,僵尸试图感染它们。

游戏基于回合制,在每一个回合中,动作顺序都是随机的。为了做到这一点,我创建了一个指针数组,它将包含所有代理程序,因此我可以在每个转弯之前对数组进行洗牌,然后通过循环遍历代理程序,我获得随机代理程序移动顺序。

问题是,当我创建指针数组时,我得到了分段错误,我无法理解为什么。分段错误发生在这里:

mDownload.execute()

感谢您的帮助!

以下是该计划主要部分的代码:

doInBackground()

这是agent.c文件:

agents_shuffle[c] = agent_new(type, playable, id, x, y);

结构代理:

/* Array to save agent pointers for shuffle*/
AGENT **agents_shuffle = NULL;

AGENT_TYPE type = 0;
unsigned char playable = 0;
unsigned short id = 0;
int c = 0;

for (int x = 0; x < WORLD_X; x++) {
    for (int y = 0; y < WORLD_Y; y++) {
        if (agent_grid[x][y].type != None) {

            type = agent_grid[x][y].type;
            playable = agent_grid[x][y].playable;
            id = agent_grid[x][y].id;

            agents_shuffle[c] = agent_new(type, playable, id, x, y);
            c++;
        }
    }
}

这是代理网格定义:

#include "agent.h"

AGENT *agent_new(AGENT_TYPE type, unsigned char playable, 
    short id, int x, int y) {

    AGENT *a = (AGENT *) malloc(sizeof(AGENT));
    a->type = type;
    a->playable = playable;
    a->id = id;
    a->x = x;
    a->y = y;

    return a;
}

void agent_destroy(AGENT *a) {
    free(a);
}

2 个答案:

答案 0 :(得分:1)

执行agents_shuffle时,您将取消引用NULL指针agents_suffle[c]

此处,agents_shuffle被定义为指向AGENT的指针数组:

AGENT **agents_shuffle = NULL;

您的agent_new函数为agent分配空间并返回指向它的指针,并尝试将其存储到agents_shuffle[c]的数组中。可能导致段错误的一个问题是永远不会分配此数组的空间。

循环中所需的最大空间量是数组中的WORLD_X * WORLD_Y元素。

尝试:

agents_shuffle = malloc((WORLD_X*WORLD_Y)*sizeof(*agents_shuffle));

答案 1 :(得分:0)

您计划将agent_shuffle作为一个指针数组 但是你把它初始化为指向指针的指针 AGENT **agents_shuffle = NULL;
您需要将上一行更改为
AGENT *agents_shuffle[WORLD_X*WORLD_Y];