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