在C中释放字符串

And*_*dna 8 c free

如果我愿意写:

char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*ack 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;
}
Run Code Online (Sandbox Code Playgroud)

你会得到的

Before: 0x100100080
After: 0x100000f50
Run Code Online (Sandbox Code Playgroud)

你会看到两个指针是不同的.这是因为字符串文字"abc"放在二进制文件的数据扇区中,当你这样做时

a = "abc"
Run Code Online (Sandbox Code Playgroud)

您正在更改指针指向a常量文字字符串,"abc"并且您正在丢失以前分配的内存.调用freea是不正确的了,只是因为它不会指向有效的动态分配的地址了.要保留指针并能够释放它,您应该复制字符串

strncpy(a, "abc", 4)
Run Code Online (Sandbox Code Playgroud)

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

  • strcpy是许多缓冲区溢出的根源.请改用strncpy. (4认同)

ram*_*ion 5

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

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

然后,您需要在完成后释放它。