我正在编写一个 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/