malloc()在strcpy()之前/右边的字符串缓冲区被破坏了吗?

时间:2015-04-18 23:08:54

标签: c string memory malloc strcpy

所以,我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()之后)。

0 个答案:

没有答案