[英]Why is malloc called on two different pointers the same address space?
下面的代碼來自一個家庭作業,討論了堆溢出利用,我將其理解為一個概念。 我不明白的是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
|--------|--------|
第一個記憶集給
buf1 buf2
|--------|22222222|
就像從buf2的開始到結尾的2一樣。
第二個記憶集給出:
buf1 buf2
|11111111|11122222|
那就是它從buf1
的開始buf1
到結束的3。
未定義的行為
由於您正在更改分配給程序的內存,因此這不會造成故障。
但是,以這種方式將buf2
傳遞給printf
會調用未定義的行為。
原因是printf
侵入為:
printf("BEFORE: buf2 = %s",buf2);
沒有辦法知道buf2
的大小,因此它將繼續下去,直到看到您的代碼未添加的空值\\0
字符為止。 幸運的是,似乎在buf2發生后立即獲得了該值為null的值。
您可以將\\0
字符添加到buf2
的末尾。
或者,也許更貼合在這種情況下,你可以usethe精度格式說明(這是一個.
通過folowed int
值),讓printf
知道有多少個字符打印。 可以這樣做:
printf("BEFORE: buf2 = %.8s",buf2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.