无法存储包含指针的结构

时间:2017-11-16 14:44:17

标签: c pointers dynamic struct save

我有三个结构:

struct Map
{
    int width, height;
    int* cases;
};
typedef struct Map Map;

struct Ship
{
    int x, y, length, firstShoot, color, hasBeenDiscovered;
};
typedef struct Ship Ship;

struct Player
{
    int activeShips;
    Map map[2];
    char lastMoves[5][128];
    Ship ships[10];
    int shipcolor[4];
    int color;
};
typedef struct Player Player;

我将地图结构用作2d动态数组。以下是我操作地图的功能:

void mallocMap(Map* map, int width, int height)
{
    map->cases = malloc(sizeof(int) * width * height);

    map->width = width;
    map->height = height;

    if (map->cases == NULL)
    {
        printf("Erreur d'allocation de memoire\n");
        exit(0);
    }
}

void freeMap(Map* map)
{
    free(map->cases);
}

int getMapValue(Map map, int x, int y)
{
    return *(map.cases + y*map.width + x);
}

void setMapValue(Map* map, int value, int x, int y)
{
    *(map->cases + y*map->width + x) = value;
}

现在我正在做的是创建一个Player类型的变量播放器,询问用户地图的宽度和高度,并为地图分配内存(malloc(sizeof(int)*width*height))。 接下来我想要做的是能够将struct Player存储在一个文件和案例的值中,但我不知道如何做到这一点。 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您没有正确阅读这些值:

    fseek(file, sizeof(Player), SEEK_SET); // set the cursor after the struct
    fread(&player->games, sizeof(int), 1, file); // read the value

    fseek(file, sizeof(int), SEEK_CUR); // set the cursor after the first value
    fread(&player->map.cases, sizeof(int), 1, file); // read the value

在第一次阅读中,您传入&player->games作为要写入的地址。此表达式的类型为int **。您可以写入包含该地址的指针,而不是写入您分配的内存。另一个读法存在同样的问题。

从每个fread调用中删除address-of运算符。此外,对fseek的调用是多余的,因为文件指针已经在正确的位置,因此您可以删除它们。

    fread(player->games, sizeof(int), 1, file); // read the value
    fread(player->map.cases, sizeof(int), 1, file); // read the value