释放C中的字符串
如果我愿意写:
char *a=malloc(sizeof(char)*4); a="abc"; char *b="abc";
我需要释放这个内存,还是由我的系统完成?
在您的情况下,您将无法释放动态分配的内存,因为您正在丢失对它的引用。
试试这个:
#include #include int main() { char *a=(char*)malloc(sizeof(char)*4); printf("Before: %p\n",a); a = "abc"; printf("After: %p\n",a); free(a); char *b = "abc"; return 0; }
你会得到的
Before: 0x100100080 After: 0x100000f50
你会看到两个指针是不同的。 这是因为字符串文字"abc"
放在二进制文件的数据扇区中,当你这样做时
a = "abc"
您正在更改a的指针指向常量文字字符串"abc"
并且您正在丢失先前分配的内存。 在a
上free
调用不再正确,只是因为它不再指向有效的动态分配地址。 要保留指针并能够释放它,您应该使用复制字符串
strncpy(a, "abc", 4)
这将有效地将字符从文字复制到动态分配的方法,保留原始指针。
你这里有内存泄漏。 当您设置a="abc"
,您没有填充刚刚分配的内存,而是重新指定指针指向静态字符串“abc”。 b
指向相同的静态字符串。
你想要的是strncpy(a, "abc", 4)
,它会将“abc”的内容复制到你分配的内存中(指向的)。
然后你需要在完成后释放它。
您不能以这种方式使用C分配字符串
a = "abc"
但是,如果你使用malloc
那么你必须使用free
,就像这样
free(a);
但请注意,如果您在示例中使用free(a)
,则会出现错误。 因为在malloc
你将指针a
值改为静态字符串"abc"
; 所以下一个free(a)
尝试释放静态数据。 你得到错误。
简单的回答是,不。 你的代码也是错误的。
具体答案:
char *a=malloc(sizeof(char)*4);
你分配内存所以你应该释放它。
a="abc";
这会将一个指向常量字符串的指针指定给char* a
,这样你就可以松开指向第一行中分配的内存的指针,你永远不应该释放常量字符串。
使用strcpy(a,"abc");
而不是a="abc";
将字符串移动到分配的内存中。
是的,你需要释放malloc返回的内存。
是的,它会导致内存泄漏。 系统无法处理此案件。