我是一个新手试图学习如何在C中制作动力学数组。当我使用代码构建它时,代码不会给我任何错误:块,但是当我运行它时会崩溃。我认为崩溃与我释放内存的方式有关,因为代码在崩溃之前给了我想要的输出。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
int *p = (int *)malloc(sizeof(*p));
printf("Hello World! I have created a dynamic array of 20x30 integers! \n");
for (i = 0; i <= 19; i++)
{
p[i] = (int )malloc(sizeof(int*));
printf(" %2d ", i);
for (j = i + 1; j <= 29 + i; j++)
{
p[i] = 0;
printf("%2d", j);
}
printf("\n");
}
for (i = 0; i <= 19; i++);
{
free(p[i]);
}
free(p);
return 0;
}
答案 0 :(得分:0)
这是问题所在。
首先,您的第一个malloc调用为1个元素的数组分配空间。
你想要从
改变它int *p = (int *)malloc(sizeof(*p));
到
int *p = (int *)malloc(sizeof(int*) * 20);
然后你的第二个malloc调用也稍微不正确。
p[i] = (int )malloc(sizeof(int*));
应改为
p[i] = (int *)malloc(sizeof(int));
你只是把星号放在错误的地方。
最后,你真的只创建一个20元素的数组。你在内部for循环中所做的就是为数组中的每个单元分配值0次。如果你想制作一个20x30阵列,你总是可以采用简单的方法并创建一维数组并使用一些数学运算(这最终是编译器对非动态2D数组的处理方式):
int main()
{
int *p = (int *)malloc(sizeof(int) * 600);
...
for (i = 0; i <= 19; i++)
{
printf(" %2d ", i);
for (j = 0; j <= 29; j++)
{
p[i * 30 + j] = 0; // It's i * 30, not i * 20 because you have to skip the space that the 'j' dimension takes up.
printf("%2d", j);
}
printf("\n");
}
free((void*)p); //I found the program crashes without the void* cast
}
我已经测试了这段代码并运行了。
希望这有帮助。