如果我要写:
char *a=malloc(sizeof(char)*4);
a="abc";
char *b="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;
}
您将获得
Before: 0x100100080
After: 0x100000f50
你会看到这两个指针是不同的。这是因为字符串文字"abc"
被放置在二进制文件的数据扇区中,当你这样做时
a = "abc"
您正在将指针更改为指向a
常量文字字符串"abc"
,并且您正在丢失先前分配的内存。调用free
ona
不再正确,因为它不再指向有效的动态分配地址。要保留指针并能够释放它,您应该复制字符串
strncpy(a, "abc", 4)
这将有效地将字符从文字复制到动态分配的方法,保留原始指针。
你这里有内存泄漏。当您设置 时a="abc"
,您并没有填充刚刚分配的内存,而是重新分配指针以指向静态字符串“abc”。 b
指向相同的静态字符串。
您想要的是strncpy(a, "abc", 4)
,它将“abc”的内容复制到您分配的内存中(a
指向)。
然后你需要在完成后释放它。
您不能使用 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 返回的内存。
是的,它会导致内存泄漏。系统无法处理此案。