C-2D阵列后释放内存

时间:2020-10-31 15:24:30

标签: arrays c free

我有问题。我创建了一个2D数组,最后,我想释放它。我的代码中的问题出在哪里? 如果我运行程序,一切正常,直到结束。它永远不会输出Succes !,所以我认为在此之前它会出错。有什么帮助吗? enter image description here 这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n=5;
    int size=51;
    char **a_name=(char**)malloc(sizeof(char*)*n);
    for(int i=0;i<n;i++){
        a_name[i]=(char*)malloc(sizeof(char)*size);
        scanf("%s",a_name[i]);
    }
    for(int i=0;i<n;i++){
        printf("%s\n",a_name[i]);
    }
    n=6;
    *a_name=realloc(*a_name,sizeof(char*)*n);
    scanf("%s",a_name[n-1]);
    printf("\n");
    for(int i=0;i<n;i++){
        printf("%s\n",a_name[i]);
    }
    for(int i=0;i<n;i++){
        free(a_name[i]);
    }
    free(a_name);
    printf("Succes!\n");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,更改

*a_name = realloc(*a_name, sizeof(char*) * n);

a_name = (char**)realloc(a_name, sizeof(char*) * n);

您不想将字符串数组(a_name)的内容重新分配给其中一个字符串本身(*a_name)。

第二,问题的根源是,在调用realloc之后,没有像在这里那样在a_name新添加的元素上调用malloc:

for(int i=0;i<n;i++) {
    a_name[i] = (char*)malloc(sizeof(char) * size); // here you allocated a 51 byte block for each char*
    scanf("%s", a_name[i]);
}

该数组的第六个元素是动态分配的指针,但是它指向的字符数组 尚未分配给您为前5个字符串分配的51个字节。

解决方案是在第二次scanf调用之前添加此行

a_name[n - 1] = (char*)malloc(sizeof(char) * size);

您的最终代码应如下所示

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n = 5;
    int size = 51;

    char **a_name = (char**)malloc(sizeof(char*)*n); 
    
    for (int i = 0; i < n; i++) {
        a_name[i] = (char*)malloc(sizeof(char)*size);
        scanf("%s", a_name[i]);
    }
    
    for (int i = 0; i < n; i++) {
        printf("%s\n", a_name[i]);
    }

    n = 6;
    a_name = (char**)realloc(a_name, sizeof(char*) * n);
    a_name[n - 1] = (char*)malloc(sizeof(char) * size); // allocate memory for the string first
    scanf("%s", a_name[n - 1]);
    printf("\n");
    for (int i = 0; i < n; i++) {
        printf("%s\n", a_name[i]);
    }
    for (int i = 0; i < n; i++) {
        free(a_name[i]);
    }
    free(a_name);
    printf("Success!\n");
    return 0;
}