微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C-2D阵列后释放内存

如何解决C-2D阵列后释放内存

我有问题。我创建了一个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;
}

解决方法

首先,更改

*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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。