如果我愿意写:
char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";
我是否需要释放此内存,还是由我的系统完成?
答案 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)
是的,它会导致内存泄漏。系统无法处理此案件。