【发布时间】:2019-07-02 15:35:28
【问题描述】:
给定一个绝对路径,我试图获取某个目录之后的部分。 getTargetPath 函数可以做到这一点,当我编译并运行下面的代码时,代码会给我预期的输出。
问题是当我在 main 中删除 malloc 行之前的 printf("\n") 时,我得到:
malloc(): 顶部尺寸损坏
中止(核心转储)
因此,当我在 malloc 行之前或之后放置 printf("\n") 时,代码似乎可以正常工作,但是当我将其删除时,出现上述错误。
我的问题是,为什么会这样?我不是要求解决我的路径字符串问题。我只是想了解导致这种行为的原因。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char* getTargetPath(const char* source)
{
int count = 0;
int i = 0;
while(*source)
{
if (*source == '/')
{
++count;
if (count == 4)
{
break;
}
}
++source;
}
return source;
}
int main()
{
const char* backup_path = "/home/ofy/real_2";
char temp1[] = "/home/dir1/dir2/dir3/dir4/dir5";
const char* s1 = temp1;
const char* s2 = getTargetPath(s1);
printf("\n");
char* full_path = (char*)malloc(strlen(backup_path) * sizeof(char));
strcpy(full_path, backup_path);
strcat(full_path, s2);
printf("%s\n", full_path);
return 0;
}
【问题讨论】:
-
您的
full_path中是否有空终止符的空间? -
实际上,它比这更糟糕,因为您还尝试将
s2连接到full_path的末尾,并且您绝对不会为此留出空间。 -
@Christian Gibbons 我刚刚尝试为它分配更多空间并且它起作用了,但我的问题仍然是为什么让 printf 解决问题,或者至少隐藏它?
-
@OmerFY:未定义的行为未定义。我们不会弄清楚分配器的精确实现,只是为了告诉您在您滥用它后它是如何损坏的。答案是“不要滥用它”。
-
未定义的行为是未定义的。与它推理是徒劳的。导致太阳变暗的未定义行为完全符合规范。