0

我是 C 的新手,并试图围绕指针、结构和二维数组。每当我学习一门新语言时,我都会尝试用它编写一个小游戏。

我有一个结构——命名Map——它包含一个指向创建二维数组的指针的指针,以及一个名为 的函数createMap(),它应该用 0 或 1 填充数组。

在我的main()函数中,我有一些调试 printf 语句。第一个被解雇了,但第二个没有。我正在使用 gcc 编译器,但没有收到任何错误消息。

我究竟做错了什么?

Map结构和功能createMap()

typedef struct {
    int x, y;
    int **map;
} Map;

Map createMap(int size, int x, int y) {
    Map m;
    m.x = x;
    m.y = y;
    m.map = malloc(x * sizeof(int *));

    for (int i=0; i<y; i++) {
        m.map[i] = malloc(y * sizeof(int));
    }

    for (int i=0; i<x*y; i++) {
        m.map[i][i] = randomInteger(i, 0, 1, 1);
    }

    return m;
}

main()功能:

    int main() {
    printf("Determining map size...");
    int size, x, y;
    x = 10;
    y = 5;

    if (x > y) {
        size = x;
    } else {
        size = y;
    }

    Map map = createMap(size, x, y);

    printf("Printing map...");
    printMap(map);

    for (int i=0; i<size;i++) {
        free(map.map[i]);
    }

    return 0;
}
4

1 回答 1

1

此代码错误并调用未定义的行为:

for (int i=0; i<x*y; i++) {
    m.map[i][i] = randomInteger(i, 0, 1, 1);
}

它应该是:

for (int i=0; i<x; i++) {
    for (int j = 0; j<y; j++) {
        m.map[i][j] = randomInteger(i*x+j, 0, 1, 1);
    }
}

如果您使用的是二维数组,则需要嵌套循环。

另外,你这里有一个错字:

for (int i=0; i<y; i++) {
    m.map[i] = malloc(y * sizeof(int));
}

应该

for (int i=0; i<x; i++) {
    m.map[i] = malloc(y * sizeof(int));
}

i<xi<y同意你上面的分配声明。

main您这里有一些错误的代码:

for (int i=0; i<size;i++) {
    free(map.map[i]);
}

应该

for (int i=0; i<x;i++) {
    free(map.map[i]);
}
free(map.map);

同意您的分配。

于 2019-09-08T18:31:26.877 回答