如何在动态分配的数组中释放内存?

时间:2016-09-24 20:52:21

标签: c

我是一个新手试图学习如何在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;
}

1 个答案:

答案 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
}

我已经测试了这段代码并运行了。

希望这有帮助。