11

如果我要写:

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

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

4

6 回答 6

16

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

试试这个:

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

strncpy(a, "abc", 4)

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

于 2012-04-08T13:46:19.793 回答
5

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

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

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

于 2012-04-08T13:45:34.023 回答
3

您不能使用 C 以这种方式分配字符串

a = "abc"

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

free(a);

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

于 2012-04-08T13:41:36.993 回答
3

简单的回答是,不是。你的代码也有问题。

具体答案:

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

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

a="abc";

这会将指向常量字符串的指针分配给您的char* a,通过这样做,您会丢失指向在第一行中分配的内存的指针,您永远不应该释放常量字符串。

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

于 2012-04-08T13:45:51.873 回答
0

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

于 2012-04-08T13:41:02.277 回答
0

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

于 2012-04-08T15:39:02.920 回答