下面的代码来自讨论堆溢出利用的家庭作业,我将其理解为一个概念。我不明白的是,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
非常感谢。:)
最佳答案
结果说明buf1
和buf2
不指向同一空间。
你的结果可以解释如下。
幸运的是,这些分配提供了以下内存布局:
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/