malloc():smallbin双链接列表已损坏

malloc():smallbin双链接列表已损坏,c,C,此代码在运行时在else中生成错误: 不存在 ***“./a.out”中出错:malloc():smallbin双链接列表已损坏:0x09faed58*** 中止(堆芯转储) 如果我这样更改串联代码: char *newPath = strcat(strcat(dest,"/"),fileName); 它会生成不同的错误: “./a.out”中出错:已损坏的双链接列表 可能是什么问题?您似乎没有正确使用strcat。您的代码似乎假定连接发生在strcat内部为您分配的新缓冲区中,但事实并非如此

此代码在运行时在else中生成错误:

不存在 ***“./a.out”中出错:malloc():smallbin双链接列表已损坏:0x09faed58*** 中止(堆芯转储)

如果我这样更改串联代码:

char *newPath = strcat(strcat(dest,"/"),fileName);
它会生成不同的错误:

“./a.out”中出错:已损坏的双链接列表


可能是什么问题?

您似乎没有正确使用strcat。您的代码似乎假定连接发生在
strcat
内部为您分配的新缓冲区中,但事实并非如此
strcat
实际上修改第一个参数指向的缓冲区,并将第二个缓冲区的内容附加到第一个缓冲区

根据:

strcat()
函数将
src
字符串附加到
dest
字符串, 覆盖
dest
末尾的终止空字节('\0'),以及 然后添加一个终止的空字节。字符串不能重叠,并且
dest
字符串必须有足够的空间来显示结果。如果
dest
为 不够大,程序行为不可预测
缓冲区溢出 是攻击安全程序的首选途径

就你而言:

char *dest; dest =  gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
将根据从
gtk_file_chooser_get_current_folder
返回的内容设置
dest
,该文件夹返回一个包含文件夹名称的缓冲区。该缓冲区中没有额外的空间供您附加到它。如果您想添加(附加)到该函数调用的结果中,您需要分配一个单独的缓冲区来保存该文件名以及您想要附加的任何内容

char *new_dest = malloc(SIZE_YOU_NEED);

strcpy(new_dest, dest);   // Copy file name from gtk_file_chooser_get_current_folder
strcat(new_dest, "/");
strcat(new_dest, fileName);
在这种情况下,您可以将最后两行快捷方式设置为:

strcat(strcat(new_dest, "/"), fileName);

因为,根据手册,
strcat
将第一个参数指针作为返回值返回给您。

您的工作环境是什么?ubuntu,使用gtk库的C程序您的问题是什么?我找不到问题并解决它
strcat
将第二个参数复制到第一个参数给定的缓冲区<代码>strcat(dest,“/”)和
strcat(strcat(dest,“/”),文件名)dest
在何处以及如何定义?(顺便说一句,你真的应该在谷歌上搜索“C格式约定”,并遵循其中的一些原则。你的代码很难阅读。)现在可以了,非常感谢你,我不知道strcat会把te结果放在第一位parametre@Faceopace很高兴它起作用了。这就是为什么在使用以前没有使用过的功能之前,检查手册很重要的原因。他们通常不会按照你认为他们应该的方式工作。:)
strcat(strcat(new_dest, "/"), fileName);