释放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"并且您正在丢失先前分配的内存。 在afree调用不再正确,只是因为它不再指向有效的动态分配地址。 要保留指针并能够释放它,您应该使用复制字符串

 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返回的内存。

是的,它会导致内存泄漏。 系统无法处理此案件。