如果我愿意写:
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"并且您正在丢失以前分配的内存.调用free上a是不正确的了,只是因为它不会指向有效的动态分配的地址了.要保留指针并能够释放它,您应该复制字符串
strncpy(a, "abc", 4)
Run Code Online (Sandbox Code Playgroud)
这将有效地将字符从文字复制到动态分配的方法,保留原始指针.
您这里有内存泄漏。设置时a="abc",您没有填充刚刚分配的内存,而是重新分配了指向静态字符串“ abc”的指针。 b指向相同的静态字符串。
相反strncpy(a, "abc", 4),您需要的是,它将“ abc”的内容复制到您分配的内存(a指向)中。
然后,您需要在完成后释放它。
| 归档时间: |
|
| 查看次数: |
20953 次 |
| 最近记录: |