[英]How are the different segments like heap, stack, text related to the physical memory?
[英]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 標准沒有提及棧和堆。 這些是給定編譯器的實現細節。 話雖如此,大多數桌面應用程序的編譯器都使用這兩種方法。
您是正確的, pa
是main
函數的本地函數,因此駐留在堆棧上。 *pa
然而不是局部變量。 它是一個計算結果為struct A
實例的表達式。
在這種情況下, malloc
函數返回一個指針,指向一個足夠大的內存塊用於struct A
並且該指針的值存儲在pa
。
一般而言, malloc
、 realloc
或calloc
返回的任何內容都位於堆中,而聲明為函數局部的變量(甚至可能指向堆的指針變量)則位於堆棧中。
簡短回答:*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.