如果我写下以下代码:
char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";
我需要释放这个内存吗,还是由我的系统自动完成了?
如果我写下以下代码:
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
函数释放 a
不再正确,因为它不再指向一个有效的动态分配的地址。如果要保留指针并能够释放它,你应该使用复制字符串的方式。
strncpy(a, "abc", 4)
这将有效地将字符从字面量复制到动态分配的方法中,保留原始指针。strcpy
函数会复制 strlen(source)
个字符而不考虑目标字符串的大小。如果源字符串长度大于目标字符串长度,则它将写入越界。 - Jackstrncpy
,你将不得不在代码末尾使用 free(a)
释放内存。 - Jacka="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返回的内存。