Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 没有编译错误,没有结构和2D数组问题,也没有第二次打印语句?_C_Arrays_Pointers - Fatal编程技术网

C 没有编译错误,没有结构和2D数组问题,也没有第二次打印语句?

C 没有编译错误,没有结构和2D数组问题,也没有第二次打印语句?,c,arrays,pointers,C,Arrays,Pointers,我是C语言的新手,我试着将注意力集中在指针、结构和2D数组上。每当我学习一门新语言时,我都会尝试用它来写一个小游戏 我有一个名为Map的结构,其中包含一个指向创建2D数组的指针的指针,还有一个名为createMap的函数,该函数应该用0或1填充数组 在我的主函数中,我有几个调试printf语句。第一个被发射,但第二个没有。我正在使用gcc编译器,没有收到任何错误消息 我做错了什么 映射结构和createMap函数: typedef struct { int x, y; int *

我是C语言的新手,我试着将注意力集中在指针、结构和2D数组上。每当我学习一门新语言时,我都会尝试用它来写一个小游戏

我有一个名为Map的结构,其中包含一个指向创建2D数组的指针的指针,还有一个名为createMap的函数,该函数应该用0或1填充数组

在我的主函数中,我有几个调试printf语句。第一个被发射,但第二个没有。我正在使用gcc编译器,没有收到任何错误消息

我做错了什么

映射结构和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;
}
    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;
}

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

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

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

以同意您的分配。

输出到标准输出,默认情况下,printf写入在标准输出中进行缓存。这意味着只有当缓冲区已满或打印换行符时,缓冲区才会被刷新并写入终端。顺便说一句,您的程序中存在内存泄漏。您只是在填充对角线。其他一切都是垃圾。要填充二维数组,需要使用printf进行嵌套的loopDebbugging是有问题的,因为如果stdout不是交互式设备,默认情况下它是行缓冲的,完全缓冲的。我建议将调试printfs替换为fprintfstderr,…。当我从0迭代到x*y-1时,问题是映射[I][I]。换句话说,map[49][49]远远超出了您分配的数组的边界。@Yonlif:因为它是双间接指针而不是真正的多维数组,编译器必须保留两个循环的阴影。如果它是一个真正的多维数组,它是一个更简单的内存布局,并且在编译时使内部维度大小已知,那么它实际上可以将其减少为一个循环。
for (int i=0; i<x; i++) {
    m.map[i] = malloc(y * sizeof(int));
}
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);