所以,我malloc()
在C中的一个函数中使用变量,这样的东西:
char * foo;
foo = (char *)malloc(32 * sizeof(char) +1);
// some irrelevant (to the variable) code
function2(&foo);
free(foo);
然后,我将一个字符串复制到foo
中的function2()
:
void function2(char ** foo)
{
// Some more (presumably) irrelevant code
strcpy(*foo, "asdf");
}
这是一个更大的项目(编译器)的一部分。我无法在独立的C程序中重现此问题,但剥离了许多变量依赖项,上面的代码似乎没问题。
我的问题是,对strcpy
的调用会导致95%的段错误(其余的未定义行为)。
在使用gdb
执行后,我发现,到目前为止,我可以print foo
看到一个空字符串:
(gdb) s
1445 // line of code right before call to strcpy()
(gdb) print *foo
$18 = 0x6064c0 ""
(gdb) s
1455 strcpy(*foo, "asdf");
(gdb)
但是,在调用strcpy()
之前,print *foo
会给我一个$19 = 0x2a00000002 <error: Cannot access memory at address 0x2a00000002>
,之后,大部分时间 strcpy()
会抛出SegFault或字符串将被破坏并导致下一个strcpy()
抛出SegFault。腐败也是随机的,因为有时指针地址将是完整的(带有乱码字符),但有时候0x0
。在这一点上,该程序偶尔会混淆其他字符串。
是什么原因造成的? * foo应该在通话前被释放吗?可能不是。其他一些代码可能会弄乱它的内存吗?
字符串似乎已正确分配。我也试过calloc(),在strcpy()
调用之前分配,不同的缓冲区大小,复制“\ 0”和从其他缓冲区复制。
打印*foo
,在strcpy()
之后,有时打印随机乱码,有时完全符合我的预期,有时什么都没有。
编辑#1:
我只能量化它:
删除strcpy()
中的function2()
来电,我在gdb
上看到*foo
变量有地址和值(“”@ 0x606420),但是函数调用返回,main函数中的指针指向0x0
,然后调用strcpy()
SegFault。
尝试模拟有问题的function2()
不起作用。 function2()
中的代码虽然广泛,但在任何时候都不会触及参数(当然,在删除strcpy()之后)。