gpt4 book ai didi

C free 在嵌套的 mallocs 和 realloc 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:34 25 4
gpt4 key购买 nike

我有以下代码:

#include <stdlib.h>

#define STRING_LENGTH 50

typedef struct entry {
char name[STRING_LENGTH];
} datum;

int main(void) {
datum *entries = NULL;
entries = (datum*) malloc(sizeof(datum)) ;
char *buffer_ = (char*) malloc(1);
free(buffer_);
void *hz = realloc(entries , 2 * sizeof(datum));
free(entries);

return 0;
}

但是如果我编译这段代码并运行二进制文件,我会得到以下错误:

*** Error in `./a.out': double free or corruption (fasttop): 0x00005572b0381010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7ff4b3842bfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7ff4b3848fc6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7ff4b384980e]
./a.out(+0x799)[0x5572af4ca799]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7ff4b37f22e1]
./a.out(+0x63a)[0x5572af4ca63a]
======= Memory map: ========
5572af4ca000-5572af4cb000 r-xp 00000000 00:29 13267238517 a.out
5572af6ca000-5572af6cb000 r--p 00000000 00:29 13267238517 a.out
5572af6cb000-5572af6cc000 rw-p 00001000 00:29 13267238517 a.out
5572b0381000-5572b03a2000 rw-p 00000000 00:00 0 [heap]
7ff4ac000000-7ff4ac021000 rw-p 00000000 00:00 0
7ff4ac021000-7ff4b0000000 ---p 00000000 00:00 0
7ff4b35bb000-7ff4b35d1000 r-xp 00000000 08:01 6815758 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff4b35d1000-7ff4b37d0000 ---p 00016000 08:01 6815758 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff4b37d0000-7ff4b37d1000 r--p 00015000 08:01 6815758 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff4b37d1000-7ff4b37d2000 rw-p 00016000 08:01 6815758 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ff4b37d2000-7ff4b3967000 r-xp 00000000 08:01 6816376 /lib/x86_64-linux-gnu/libc-2.24.so
7ff4b3967000-7ff4b3b67000 ---p 00195000 08:01 6816376 /lib/x86_64-linux-gnu/libc-2.24.so
7ff4b3b67000-7ff4b3b6b000 r--p 00195000 08:01 6816376 /lib/x86_64-linux-gnu/libc-2.24.so
7ff4b3b6b000-7ff4b3b6d000 rw-p 00199000 08:01 6816376 /lib/x86_64-linux-gnu/libc-2.24.so
7ff4b3b6d000-7ff4b3b71000 rw-p 00000000 00:00 0
7ff4b3b71000-7ff4b3b94000 r-xp 00000000 08:01 6816210 /lib/x86_64-linux-gnu/ld-2.24.so
7ff4b3d6a000-7ff4b3d6c000 rw-p 00000000 00:00 0
7ff4b3d93000-7ff4b3d94000 rw-p 00000000 00:00 0
7ff4b3d94000-7ff4b3d95000 r--p 00023000 08:01 6816210 /lib/x86_64-linux-gnu/ld-2.24.so
7ff4b3d95000-7ff4b3d96000 rw-p 00024000 08:01 6816210 /lib/x86_64-linux-gnu/ld-2.24.so
7ff4b3d96000-7ff4b3d97000 rw-p 00000000 00:00 0
7ffd1bf9f000-7ffd1bfc0000 rw-p 00000000 00:00 0 [stack]
7ffd1bfdd000-7ffd1bfdf000 r--p 00000000 00:00 0 [vvar]
7ffd1bfdf000-7ffd1bfe1000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

如果我删除行 (char *buffer_ = (char*) malloc(1);) 和下一行 free(buffer_); 二进制文件完美运行.如果我用 printf("Hello"); 替换相同的两行,我会得到同样的错误。如果我将 char name[..] 替换为 double name 它会起作用,如果我再次将 char name[..] 替换为 long double 它失败。这对我来说很奇怪。我做错了什么?

最佳答案

如果一切顺利,您应该将 realloc 视为 malloc,然后是 memcpy,然后是 free。因此,特别是如果 realloc 成功,当您执行 free 时,您的 entries 分配早就消失了。

关于C free 在嵌套的 mallocs 和 realloc 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55051406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com