下面的代码来自讨论堆溢出利用的家庭作业,我将其理解为一个概念。我不明白的是,malloc和这个代码示例中的指针到底是怎么回事。显然两个指针都指向堆中的同一个空间,但这是为什么?难道malloc不为buf1保留空间,然后为buf2保留另一个空间吗?

int main(int argc, const char * argv[])
{

    int diff, size = 8;
    char *buf1, *buf2;
    buf1 = (char * )malloc(size);
    buf2 = (char *)malloc(size);
    diff = buf2-buf1;
    memset(buf2, '2', size);
    printf("BEFORE: buf2 = %s",buf2);
    memset(buf1, '1', diff +3);
    printf("AFTER: buf2 = %s", buf2);
    return 0;
}

此代码生成输出
BEFORE: buf2 = 22222222AFTER: buf2 = 11122222

非常感谢。:)

最佳答案

结果说明
buf1buf2不指向同一空间。
你的结果可以解释如下。
幸运的是,这些分配提供了以下内存布局:

buf1      buf2
|--------|--------|

第一个memset给出
buf1      buf2
|--------|22222222|

从buf2的开始到2的结束。
第二个memset给出:
buf1      buf2
|11111111|11122222|

即从buf1开始设置到结束后3。
未定义的行为
这并不是seg fault,因为您正在更改分配给程序的内存。
然而,以这种方式将buf2传递到printf将调用未定义的行为。
原因是printf包括:
printf("BEFORE: buf2 = %s",buf2);

无法知道buf2的大小,因此它将继续,直到看到代码未添加的空值\0字符为止。幸运的是,在buf2发生后立即得到值,即为空值。
您可以将\0字符添加到buf2的结尾。
或者,在这种情况下,您可以使用精度格式说明符(由.值折叠而成的int来让printf知道要打印多少字符。这样做:
printf("BEFORE: buf2 = %.8s",buf2);

关于c - 为什么在两个不同的指针上的malloc调用相同的地址空间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23330677/

10-10 13:53