在C中释放字符串

时间:2012-04-08 13:39:10

标签: c free

如果我愿意写:

char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";

我是否需要释放此内存,还是由我的系统完成?

6 个答案:

答案 0 :(得分:11)

在您的情况下,您将无法释放动态分配的内存,因为您正在丢失对它的引用。

试试这个:

#include <stdio.h>
#include <stdlib.h>

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

复制字符串
strncpy(a, "abc", 4)

这将有效地将字符从文字复制到动态分配的方法,保留原始指针。

答案 1 :(得分:4)

你这里有内存泄漏。当您设置a="abc"时,您没有填充刚分配的内存,而是重新指定指针指向静态字符串“abc”。 b指向相同的静态字符串。

您想要的是strncpy(a, "abc", 4),它会将“abc”的内容复制到您分配的内存中(a指向的内容)。

然后你需要在完成后释放它。

答案 2 :(得分:3)

你不能用C

以这种方式分配字符串
a = "abc"

但是,如果您使用malloc,那么您必须使用free,就像这样

free(a);

但请注意,如果您在示例中使用free(a),则会收到错误消息。因为在malloc之后您将指针a更改为静态字符串"abc"; 所以下一个free(a)尝试释放静态数据。你得到了错误。

答案 3 :(得分:3)

简单回答是,不。你的代码也是错误的。

具体答案:

char *a=malloc(sizeof(char)*4);

你分配内存所以你应该释放它。

a="abc";

这会将一个指向常量字符串的指针分配给char* a,这样你就可以松开指向第一行中分配的内存的指针,你永远不应该释放常量字符串。

使用strcpy(a,"abc");代替a="abc";将字符串移动到已分配的内存中。

答案 4 :(得分:0)

是的,你需要释放malloc返回的内存。

答案 5 :(得分:0)

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