回答
請注意,一個變量是從未申報「上堆」。只讀存儲器所指向的指針可以是上(從)堆中分配。
在你的榜樣,你可以聲明name
確實之外的任何功能,那麼它會在全球內存中。您也可以delcare函數內部變量,由關鍵字static
之前。後者將在全局內存中分配變量,但它只會在您聲明它的函數中可見。
要使用指針變量,您現在必須爲它指定內存以指向您使用malloc
在堆上分配的內存。
TL; DR版
你不能聲明一個變量,使得變量本身住在堆。
詹姆斯·米切納版本
C語言定義不談論堆棧或堆;它談論存儲持續時間。
對象與auto
存儲持續時間(塊中的static
關鍵字中,沒有聲明任何東西)具有從該塊和結束的開始延伸壽命當塊退出:
void foo(void)
{
int a = 0; // lifetime of a extends to the end of
// the function
for (int i = 0; i < 10; i++) // lifetime of i and b extend to the end
{ // of the for loop
int b = a + i;
printf("b = %d\n", b);
}
}
大多數實現分配存儲用於從硬件堆棧auto
對象,因爲堆疊使得該行爲易於實現。
對象與static
存儲持續時間(任何一個功能的static
關鍵字外或聲明)具有從程序被加載到存儲器中的時間延長的壽命,直至程序退出:
int a = 0; // lifetime of a extends over the lifetime of
// the entire program
int main(void)
{
static int b = 10; // lifetime of b also extends over the lifetime
// of the program, but is only visible within
// main
...
}
大多數實現爲可執行文件本體內的static
對象留出存儲空間(對於使用ELF格式的可執行文件,此類對象將存儲在圖像的.bss
,.data
或.rodata
部分)。
對象與allocated
存儲持續時間有從他們被分配,直到它們被明確地給free
呼叫釋放時間延長壽命(任何與malloc
,calloc
,或者realloc
分配)。
int *foo(size_t size)
{
int *ptr = malloc(sizeof *ptr * size);
return ptr;
}
void bar(void)
{
int *p = foo(10);
// do something with p
free(p);
}
的變量ptr
和p
只存在的各自的功能的壽命,並且它們會從堆棧中通常被分配。這兩個變量點對象從直到它與free
釋放它與malloc
分配的時間存在。
大多數實現用於從堆allocated
對象分配存儲空間。
確實沒有辦法讓你聲明一個對象具有allocated
存儲期限;您可以通過malloc
,calloc
或realloc
創建此對象的唯一方法。無論您聲明用於存儲由這些函數返回的指針值的對象將具有auto
或static
存儲持續時間。
1.在實踐中,對於所有的局部對象存儲在函數入口被分配,並在函數出口釋放,而不管對象的生命週期是否在整個功能或限於函數內的一個塊。但是,您永遠不應該依賴於在該對象的生命週期之外訪問的存儲。例如,
i
和b
的生存期限於for
循環;即使每個存儲的存儲空間都可能已在函數入口處分配,您也不應嘗試在循環體外訪問該存儲。畢竟,C被設計在一臺帶有堆棧的機器上。 - 1. C++是堆棧還是堆分配?
- 2. 有關堆棧段聲明
- 3. 如何判斷指針是指向堆棧還是指向堆?
- 4. 類的字段,它們是存儲在堆棧還是堆?
- 5. C++ STL內存管理:堆棧還是堆?
- 6. 我應該讓堆棧段很大還是堆段很大?
- 7. 休眠 - 在堆棧上還是在堆上?
- 8. 堆棧變量或函數聲明
- 9. 堆棧上聲明的最大允許大小是多少?
- 10. 是否可以在聲明中修復堆棧大小?
- 11. ptrace會中斷CPU上下文,用戶空間堆棧還是內核堆棧?
- 12. 錯誤:全局堆棧與追加/ 3
- 13. 如何創建全局導航堆棧?
- 14. 錯誤:超出全局堆棧
- 15. 堆棧是實現細節,還是不是?
- 16. 在函數中創建的對象,是保存在堆棧還是堆上?
- 17. 什麼「堆棧無效,堆棧只支持堆棧1和堆棧5」是什麼意思?
- 18. 使用Memento撤銷/重做:堆棧,隊列還是隻是LinkedList?
- 19. 堆棧指針是長大還是長小?
- 20. Java基元是在棧還是在堆上?
- 21. Javascript-setImmediate()與nextTick()是堆棧還是消息?
- 22. Java的堆棧分配的大小是物理還是邏輯?
- 23. 堆棧或堆
- 24. 什麼是LAMP堆棧?
- 25. Bitnami堆棧是否有效?
- 26. 什麼是Linux堆棧?
- 27. 什麼是jQuery堆棧?
- 28. 是我的代碼堆棧?
- 29. 什麼是堆棧跟蹤?
- 30. 是否Zend_Db_Adapter :: beginTransaction()堆棧?
他們嗎?變量在堆? hmmmm –
C沒有指定實現細節。 – Olaf
@SouravGhosh:您可以使用基於堆的方法而不是堆棧。 – Olaf