我写了这段纯真的代码,结果导致了这样一个邪恶的错误:
static char * prefixed( char * pref, char *str ) {
size_t newalloc_size = sizeof(char) * (strlen(pref) + strlen(str));
char * result = (char*) malloc( newalloc_size );
[...]
调试(cgdb)的输出:
Breakpoint 1, prefixed (pref=0x401345 "Env: ", str=0x4012b5 "Home") at ./src/backend/os/env.c:77
(gdb) s
(gdb) p newalloc_size
$1 = 9
(gdb) s
envtest: malloc.c:2368: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >=
(unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)'
failed.
Program received signal SIGABRT, Aborted.
0x00007ffff7a68fd5 in raise () from /usr/lib/libc.so.6
(gdb)
我也检查了传递的参数。他们应有的位置:
Breakpoint 1, prefixed (pref=0x401345 "Env: ", str=0x4012b5 "Home") at ./src/backend/os/env.c:77
(gdb) p pref
$2 = 0x401345 "Env: "
(gdb) p strlen(pref)
$3 = 5
(gdb) p str
$4 = 0x4012b5 "Home"
(gdb) p strlen(str)
$5 = 4
(gdb)
谁能想象,这里出了什么问题?我知道有一些函数可以将两个字符串组合在一起,但是我想自己做!
亲切的问候。
最佳答案
这闻起来像是程序其他地方的内存泄漏或缓冲区溢出(或其他堆损坏)。我建议使用-Wall -g
的gcc
选项重新编译它,以改善程序,直到编译器未发出警告为止,并建议使用valgrind和gdb
调试问题。
其实你的说法
result = (char*) malloc( newalloc_size );
是错误的(用于终止空字节的空间不足)。你可能想要
result = malloc(newalloc_size+1);
但您应该学习使用asprintf
关于c - malloc.c中的SIGABRT,刚刚发生了什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13181241/