为什么在我之前或之后都有printf()时,为什么“ malloc():损坏的最大大小”错误得到修复?

时间:2019-07-02 15:35:28

标签: c pointers malloc

给出一个绝对路径,我试图获取某个目录之后的部分。 getTargetPath函数可以做到这一点,当我编译并运行以下代码时,该代码为我提供了预期的输出。

问题是,当我删除主行中带有printf("\n")的行之前的malloc时,我得到:

malloc():损坏的最大大小
中止(核心已弃用)

因此,当我在printf("\n")行的前面或后面放置malloc时,代码似乎可以正常工作,但是当我删除它时,上面的错误就会出现。

我的问题是,为什么会这样?我不是要解决路径字符串问题的解决方案。我只是想了解导致这种现象的原因。

#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;
}

1 个答案:

答案 0 :(得分:1)

您没有为full_path分配足够的空间:

char* full_path = (char*)malloc(strlen(backup_path) * sizeof(char));

它必须至少与backup_path s2一样长,再加上1作为终止空字节,但是您只能容纳backup_path 。这导致您在调用undefined behavior的已分配内存末尾进行写操作。

由于行为不确定,您无法预测程序将执行的操作。它可能会崩溃,它可能会输出奇怪的结果,或者看起来可以正常工作。同样,进行看似无关的代码更改也可能会更改UB的显示方式。这正是删除printf调用时看到的。使用printf时,程序可以“运行”,而如果没有,则程序会崩溃。

要分配适当的空间:

char* full_path = (char*)malloc(strlen(backup_path) + strlen(s2) + 1);