我想将文件名路径存储在char
变量中,稍后通过函数调用传递它。为此,我声明了以下char缓冲区:
char *filename_path = malloc(100* sizeof(char));
现在,为了测试它,我使用路径分配它,然后打印缓冲区的值以确保它适合。
filename_path= "../Datasets/Cluster(%d)%s";
printf("%s\n", filename_path);
...
free(filename_path);
然而,我收到此错误:
../Datasets/Cluster(%d)%s
k.out(1154,0x7fff9843c3c0) malloc: *** error for object 0x103fbbacb: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
有人可以提示我问题的原因吗?谢谢
答案 0 :(得分:2)
该行
filename_path= "../Datasets/Cluster(%d)%s";
不会将字符串文字的内容复制到filename_path
指向的内存中;它用字符串文字的地址覆盖 filename_path
的值。你基本上丢弃了malloc
返回的值,导致a)内存泄漏,b)调用free
时出错。
使用strcpy
函数:
strcpy( filename_path, "../Datasets/Cluster(%d)%s" );
答案 1 :(得分:1)
您的代码使用新的常量字符串(filename_path = "../Datasets/Cluster(%d)%s"
行)覆盖malloc返回的指针。然后,它试图释放它。
你不能这样做,因为指针与malloc返回的指针不再相同。
要将内容复制到malloc的字符串中,您应该使用strncpy。
像这样:
char *filename_path = malloc(100* sizeof(char));
strncpy(filename_path, "../Datasets/Cluster(%d)%s", 100);
printf("%s\n", filename_path);
free(filename_path);
答案 2 :(得分:0)
问题是您需要保存原始指针才能释放它:
因此,存储一个临时指针并将其释放。
char *filename_path ,*temp_path;
filename_path = malloc(100* sizeof(char));
temp_path = filename_path;
//your code for filename_path
free(temp_path);
答案 3 :(得分:0)
这样看:
您正在分配100个字节的内存,并指定filename_path
指针指向分配的内存。
您现在更改 filename_path
指向静态字符串“../Datasets/Cluster(%d)%s”。
由于您更改了filename_path
所指向的位置,因此您不再拥有指向您之前分配的内存的指针,并且无法再将其释放。
当你试图释放filename_path
时,你实际上是在尝试释放静态字符串“../Datasets/Cluster(%d)%s”,当然正如错误消息所说,不是实际上是由malloc分配的。
答案 4 :(得分:0)
问题是malloc()
的内存位置与filename_path= "../Datasets/Cluster(%d)%s";
malloc()
在堆上分配内存并返回指向该内存的指针。字符串文字完全位于其他地方 - 通常是静态/数据(有关详细信息,请参阅此帖子where in memory are string literals ? stack / heap?)
由于您已指定filename_path
指向除了您使用malloced之外的其他位置,因此您无法释放它。