在C中释放字符串

在C中释放字符串,c,free,C,Free,如果我写: char *a=malloc(sizeof(char)*4); a="abc"; char *b="abc"; 我需要释放这个内存,还是由我的系统完成的?是的,您需要释放malloc返回的内存。您不能用C以这种方式分配字符串 a = "abc" 但是,如果使用malloc,则必须使用free,如下所示 free(a); 但请注意,如果您在示例中使用free(a),则会出现错误。因为在malloc之后,您将指针a值更改为静态字符串“abc”; 因此,下一个free(a)尝试释放静

如果我写:

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

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

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

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

a = "abc"
但是,如果使用
malloc
,则必须使用
free
,如下所示

free(a);
但请注意,如果您在示例中使用
free(a)
,则会出现错误。因为在
malloc
之后,您将指针
a
值更改为静态字符串
“abc”

因此,下一个
free(a)
尝试释放静态数据。您会得到错误。

您的内存泄漏。当您设置
a=“abc”
时,您不是在填充刚刚分配的内存,而是在重新分配指向静态字符串“abc”的指针
b
指向同一个静态字符串

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


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

简单回答是,不是。而且您的代码有缺陷

具体答复:

char *a=malloc(sizeof(char)*4);
分配内存是为了释放内存

a="abc";
这会将一个指向常量字符串的指针分配给
char*a
,如果这样做会使指向第一行中分配的内存的指针松动,则不应释放常量字符串


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

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

试试这个:

#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;
}
您将看到这两个指针是不同的。这是因为字符串literal
“abc”
被放置在二进制文件的数据扇区中,当您这样做时

a = "abc"
您正在将
a
的指针更改为指向常量文本字符串
“abc”
,并且您正在丢失以前分配的内存。在
a
上调用
free
不再正确,因为它不再指向有效的动态分配地址。要保留指针并能够释放它,您应该使用

strncpy(a, "abc", 4)

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

是的,这将导致内存泄漏。系统无法处理此情况。

另外一条评论是,我相信您不需要sizeof(char),因为在我迄今为止看到的所有实现中,sizeof(char)始终是1字节。So-malloc(4);将suffice@Lefteris实际上,上面的实现是好的。虽然大多数系统使用单字节字符,但上面的实现清楚地说明了分配的是什么,如果代码更改为使用unichars(通常是两个字节),那么更改就更容易了。@ThomasW恐怕我不确定unichar到底是什么,但我想它与unicode有关。快速的谷歌搜索表明objective-c是另一种语言:P,但任何unicode字符通常不仅仅称为字符。以宽字符为例。虽然可能是错误的,但这是我迄今为止在处理的实现中看到的是的,unichar是一个Unicode字符,但这个概念并不特定于objective-C。一般来说,对数据结构的大小进行假设不是一个好主意。strcpy是许多缓冲区溢出的根源。请改用strncpy。strcpy是许多缓冲区溢出的根源。用strncpy代替。你是对的,我只是在考虑这个具体的案例,让我来编辑it@rampion只是出于好奇你为什么这么说?因为strcpy复制strlen(源)字节,而这些字节可能并不总是根据目标的缓冲区大小进行检查?或者我理解错了?@Lefteris如果根本没有检查,
strcpy
将复制
strlen(源)
,而不考虑目标大小。如果source length>dest length,则它将写入外部边界。@Andna当然,如果使用
strncpy
则必须在代码末尾使用
free(a)
释放内存。
strncpy(a, "abc", 4)