簡體   English   中英

為什么在兩個不同的指針上的malloc調用相同的地址空間?

[英]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

非常感謝。 :)

結果說明

buf1buf2指向的空間不同。

您的結果可以解釋如下。

幸運的是,這些分配提供了以下內存布局:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM