如何解决C-2D阵列后释放内存
我有问题。我创建了一个2D数组,最后,我想释放它。我的代码中的问题出在哪里? 如果我运行程序,一切正常,直到结束。它永远不会输出Succes !,所以我认为在此之前它会出错。有什么帮助吗? 这是我的代码:
#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 举报,一经查实,本站将立刻删除。