我正在编写一个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;
}
这里我收到了一个错误:
*`./a'出错:free():无效指针: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;
}
这只是一个小例子,我不知道在哪里释放内存。所以我可以释放内存的方式和地点,让我自由约会或使用字符指针吗?
第二次编辑:
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;
}
我必须遵循哪些规则来避免内存错误。
非常感谢。答案 0 :(得分:4)
在行中:
a
您为a="mama";
分配动态分配的内存块的地址,但随后在行中:
"mama"
您使用文字字符串常量free(a);
的地址重新分配。丢弃指向动态分配块的指针,以便在调用
a
a="mama";
不再是有效的堆内存块,无法解除分配。
C中的字符串(和一般数组)不是数据第一类,也不能分配。你应该替换:
strcpy( a, "mama" ) ;
与
"mama"
赋值设置指针值 - 它不将a
复制到strcpy()
的内存点。另一方面,a
调用将字符串复制到main()
引用的动态内存块 。
在你的第二个代码片段中,你正在"泄漏"由于您在不释放原始块的情况下重新分配a
,因此在a
中分配了内存。虽然在您的示例中您还没有免费GetDate()
,但它仍然可以免费使用,因为</asp:TemplateField>
中的分配是动态的。作为一种编码风格,在函数中动态分配内存并返回其指针是一个坏主意,因为它使调用者有责任知道内存是动态分配的并且必须是自由的,并且它会引发内存泄漏