C 打印字符缓冲区时出现问题

C 打印字符缓冲区时出现问题,c,C,我想将文件名路径存储在一个char变量中,然后通过函数调用传递它。为此,我声明了以下字符缓冲区: char *filename_path = malloc(100* sizeof(char)); 现在,为了测试这一点,我使用一个路径分配它,然后打印缓冲区的值,以确保它适合 filename_path= "../Datasets/Cluster(%d)%s"; printf("%s\n", filename_path); ... free(filename_path); 但是,我得到了这个错

我想将文件名路径存储在一个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

有人能告诉我问题出在哪里吗?谢谢

问题是您需要保存原始指针以释放它:

因此,存储一个临时指针并释放它

char *filename_path ,*temp_path; 
filename_path  =  malloc(100* sizeof(char));
temp_path = filename_path;

//your code for filename_path

free(temp_path);
这样看:

您正在分配100字节的内存,并将文件名\u路径指针分配给指向该分配内存的指针

现在,您可以将filename_path更改为指向静态字符串../Datasets/Cluster%d%s

因为您更改了filename_path指向的位置,所以您不再有指向先前分配的内存的指针,也不再有任何方法来释放它

当您尝试释放filename_path时,实际上是在尝试释放静态字符串../dataset/Cluster%d%s,当然,正如错误消息所说,它实际上不是由malloc分配的


您的代码正在用一个新的常量字符串覆盖malloc返回的指针,即filename\u path=../Datasets/Cluster%d%s行。那么,它正试图释放它

您不能这样做,因为指针不再与malloc返回的指针相同

要将内容复制到malloc'ed字符串中,应使用

像这样:

char *filename_path =  malloc(100* sizeof(char)); 

strncpy(filename_path, "../Datasets/Cluster(%d)%s", 100);
printf("%s\n", filename_path);

free(filename_path);
线路

filename_path= "../Datasets/Cluster(%d)%s";
不将字符串文字的内容复制到filename\u path指向的内存中;它用字符串文本的地址覆盖filename_path的值。您基本上是在丢弃从malloc返回的值,导致内存泄漏,并在调用free时出错

使用strcpy函数代替赋值运算符:

strcpy( filename_path, "../Datasets/Cluster(%d)%s" );

问题是malloc的内存位置与字符串文字,如filename_path=../Datasets/Cluster%d%s

malloc在堆上分配内存并返回指向该内存的指针。字符串文字完全位于其他地方-通常位于static/dataset中。有关更多信息,请参阅本文


由于您将filename\u path指定给指向malloced以外的其他位置,因此无法释放它。

您只能释放malloc返回的指针。@melpomene感谢您的回答。你能告诉我如何在这种情况下免费!p=malloc。。。;p=。。。是内存泄漏。您正在覆盖malloc.filename\u path=../Datasets/Cluster%d%s;->strcpyfilename\u路径,../Datasets/Cluster%d%s@我喜欢你的方式。非常干净!非常感谢。