无法释放C中的Realloc分配内存

无法释放C中的Realloc分配内存,c,heap-memory,realloc,heap-corruption,C,Heap Memory,Realloc,Heap Corruption,在我尝试释放分配的内存之前,我的代码工作正常。我malloc编辑了文件指针,之后我使用realloc来增加大小。但是当我试图释放内存时,它会给我无效的指针错误,不知道为什么 char *files = malloc(1); char *temp = strdup(argv[i]); strcat(temp, "/"); strcat(temp, dp->d_name); DIR *child_dir; child_dir = opendir (temp); if (child_dir =

在我尝试释放分配的内存之前,我的代码工作正常。我
malloc
编辑了
文件
指针,之后我使用
realloc
来增加大小。但是当我试图释放内存时,它会给我无效的指针错误,不知道为什么

char *files = malloc(1);
char *temp = strdup(argv[i]);
strcat(temp, "/");
strcat(temp, dp->d_name);
DIR *child_dir;
child_dir = opendir (temp);

if (child_dir == NULL) {
    files = realloc(files, strlen(dp->d_name)+1);
    strcat(files, dp->d_name);
    strcat(files, "/");
} else {
    struct dirent *child_dp;
    while ((child_dp = readdir (child_dir)) != NULL) {
        if (!strcmp(child_dp->d_name, ".")
            || !strcmp(child_dp->d_name, ".."))
                continue;

        files = realloc(files, strlen(child_dp->d_name) + 1);
        strcat(files, child_dp->d_name);
        strcat(files, "/");
    }
}
close(fd[0]);
int n = write(fd[1], files, strlen(files));
free(temp); // free
free(files); // free
temp = NULL;
files = NULL;
return;
这就是我的错误

======= Backtrace: =========
/lib64/libc.so.6(+0x721af)[0x7fa2e697c1af]
/lib64/libc.so.6(+0x77706)[0x7fa2e6981706]
/lib64/libc.so.6(+0x78453)[0x7fa2e6982453]
./myfind[0x40110c]
./myfind[0x400b02]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fa2e692a6e5]
./myfind[0x400a09]
======= Memory map: ========

注意:如果我在不释放任何内存空间的情况下运行相同的代码,它可以正常工作。这意味着指针指向内存中的正确位置。

您正在用以下代码破坏堆:

char *temp = strdup(argv[i]);
strcat(temp, "/");
strcat(temp, dp->d_name);
strdup
只为它复制的字符串分配足够的空间,但是您可以将更多的字符串连接到末尾,而无需重新分配空间

当您在
if
条件下使用
realloc
文件时,您也没有为
NUL
终止符留出空间,尽管在大多数情况下,您可以避免(但您应该分配正确的金额)


最后,在
else
案例的
while
循环中,每个
realloc
只为您添加的内容分配了足够的空间,但没有为已经存在的内容留出空间(同样,没有为
NUL
终止符留下空间)。重复的误用保证会在一段时间后导致堆损坏。

您正在使用以下代码损坏堆:

char *temp = strdup(argv[i]);
strcat(temp, "/");
strcat(temp, dp->d_name);
strdup
只为它复制的字符串分配足够的空间,但是您可以将更多的字符串连接到末尾,而无需重新分配空间

当您在
if
条件下使用
realloc
文件时,您也没有为
NUL
终止符留出空间,尽管在大多数情况下,您可以避免(但您应该分配正确的金额)


最后,在
else
案例的
while
循环中,每个
realloc
只为您添加的内容分配了足够的空间,但没有为已经存在的内容留出空间(同样,没有为
NUL
终止符留下空间)。重复的误用会在一段时间后导致堆损坏。

当您执行
strcat(temp,“/”)时,会导致未定义的行为
temp
只能容纳您复制它的
argv[i]
字符串,它没有空间让您将其他字符串连接到它。当您执行
strcat(temp,“/”)时,会导致未定义的行为
temp
只能容纳您复制它的
argv[i]
字符串,它没有空间让您将其他字符串连接到它。“在大多数情况下,您可以侥幸逃脱”,我不确定这是否会给您留下错误的印象。。。。也许插入语应该是:“如果你没有分配正确的内存,你应该被枪毙!”,或者可能只是--“未定义的行为结果”
:)
@DavidC.Rankin:是的,我只是指出有些错误通常不会在某些或所有编译器/系统上引起症状,所以“它可以工作”仅仅说代码是正确的是不够的。是的,我理解了你所说的要点,只是在这个星期五晚上我觉得有点奇怪/幽默(因此,
:)
“在大多数情况下,你会侥幸逃脱”,我不确定这是否会留下错误的印象。。。。也许插入语应该是:“如果你没有分配正确的内存,你应该被枪毙!”,或者可能只是--“未定义的行为结果”
:)
@DavidC.Rankin:是的,我只是指出有些错误通常不会在某些或所有编译器/系统上引起症状,所以“它可以工作”仅仅说代码是正确的是不够的。是的,我理解了你所说的要点,只是在这个星期五晚上我觉得有点奇怪/幽默(因此
:)