簡體   English   中英

內存段堆棧和堆

[英]Memory segments stack and heap

我查看了很多主題,但仍然無法找出發生這種情況的原因:

struct B
{
    int _arr[5];
};
struct A
{
    struct B * _pb;
};
int main() {
    int i;

    struct B b;
    struct A *pa = (struct A*)malloc(sizeof (struct A));
    for (i=0;i<5;++i)
    {
        b._arr[i] = i;
    }
    pa->_pb=&b;
    Struct A a = *pb;
}

為什么 pa 在堆棧上找到而 *pa 在堆上找到! 兩者都是局部變量,應該只在范圍內有效,所以它應該在堆棧上。 還有為什么 a._pb->_arr[2] 在堆棧上不應該在堆上? 誰能為我澄清什么時候應該在堆棧上,什么時候應該在堆上

變量pa在堆棧上。 指向的內存在堆上。

有點圖形化的指針變量可以這樣描述:

+----+     +--------------------------------+
| pa | --> | allocated memory for structure |
+----+     +--------------------------------+

上面說明的兩個位置( pa和它指向的內存)可以在不同的“段”中,也可以在同一段中。

並且a._pb->_arr[2]位於堆棧上,因為a._pb指向堆棧上的b

最后是關於“堆棧”的說明。 雖然將局部變量存儲在堆棧上是很常見的,但 C 規范並未對此進行任何說明。 局部變量是真正的自動變量,C 規范只指定了那些不應該存儲它們的地方的語義。

首先,C 標准沒有提及棧和堆。 這些是給定編譯器的實現細節。 話雖如此,大多數桌面應用程序的編譯器都使用這兩種方法。

您是正確的, pamain函數的本地函數,因此駐留在堆棧上。 *pa然而不是局部變量。 它是一個計算結果為struct A實例的表達式。

在這種情況下, malloc函數返回一個指針,指向一個足夠大的內存塊用於struct A並且該指針的值存儲在pa

一般而言, mallocrealloccalloc返回的任何內容都位於堆中,而聲明為函數局部的變量(甚至可能指向堆的指針變量)則位於堆棧中。

簡短回答:*pa(pa 指向的內容)在堆上找到,因為那是您使用 malloc() 分配內存的地方。 指針本身變量 pa 被分配在堆棧上,因為它是一個局部變量。

長答案:確保您注意指針和指針所指內容之間的區別。

像這樣的聲明:

內部 [5]

告訴編譯器為 5 元素數組保留空間,同時聲明如下:

整數 *a;

告訴編譯器為指針保留空間。 如果你想讓指針指向一個數組,那么你需要分配內存,通常在堆上使用 malloc(),然后在使用 free() 完成后釋放它。

更讓人困惑的是,在 C 語言中,數組運算符 [] 等價於指針算術 *() ,因此這兩個語句是完全等價的,無論 a 被聲明為指針還是數組:

[2] = 5;

*(a + 2) = 5;

題外話:這會導致一些有趣的可能性。 上面兩個語句也等價於這個:

2[a] = 5;

因為加法在 C 中是可交換的:

2[a] = 5;

*(2 + a) = 5;

*(a + 2) = 5;

[2] = 5;

但這在 C++ 中絕對不起作用,原因是離題太遠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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