gpt4 book ai didi

c - 如何释放C中的内存

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:25 27 4
gpt4 key购买 nike

我正在编写一个 C 程序,但我遇到了一些内存错误,所以我决定编写一个小程序来查看何时以及如何释放内存。

我的例子:

int main() {
char *a=malloc(5);
a="mama";
char *b=malloc(strlen(a));
printf("%s\n",a);
strcpy(b,a);
free(a);
printf("%s\n",b);
return 0;

这里我遇到了一个错误:

* Error in `./a': free(): invalid pointer: 0x0000000000400757 *

但是当我只改变一行时:

int main() {
char *a=malloc(5);
strcpy(a,"mama");
char *b=malloc(strlen(a));
printf("%s\n",a);
strcpy(b,a);
free(a);
printf("%s\n",b);
return 0;

我的第二个程序运行良好,那么为什么我在第一个程序中遇到此错误?我希望你能解释一下原因。

在我的真实程序中,我是这样做的:

    char * getDate(){

char *date=malloc(5);
//some instructions here
return date;
}


int main() {
char *a=malloc(5);//im sure that a will not exceed 5 bytes
a=getDate();
return 0;
}

这只是一个小例子,我不知道在哪里释放内存。所以我如何以及在哪里可以释放内存,我要释放日期还是 char 指针?

第二次编辑:

void getDate(char *a){
//some instructions here
strcpy(a,"haha");

}
int main() {
char *a=malloc(5);
getDate(a);
int i= strlen(a);
printf("%s and the size is :%d\n",a,i);
free(a);
return 0;
}

为了避免内存错误,我必须遵守哪些规则。

非常感谢。

最佳答案

行内:

char *a=malloc(5);

您为 a 分配动态分配的内存块的地址,但随后在该行中:

a="mama";

重新分配它为文字字符串常量"mama" 的地址。丢弃指向动态分配 block 的指针,以便在调用时

free(a);

a 不再是有效的堆内存块,无法释放。

C 中的字符串(和一般的数组)不是数据一级类型,不能赋值。你应该替换:

a="mama";

strcpy( a, "mama" ) ;

赋值设置指针值 - 它不会“mama”复制到a指向的内存。另一方面,strcpy() 调用将字符串复制到由 a 引用 的动态内存块。

在您的第二个代码片段中,您正在“泄漏”在 main() 中分配的内存,因为您在没有释放原始 block 的情况下重新分配了 a。尽管在您的示例中您没有释放 a,但它仍然可以释放,因为 GetDate() 中的分配是动态的。作为一种编码风格,在函数中动态分配内存并返回它的指针是一个坏主意,因为它使调用者有责任知道内存是动态分配的并且必须被释放,并且它会引起内存泄漏。

关于c - 如何释放C中的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36248479/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com