p
,*p
和**p
什麼是內存分配(如果有的話)以及它們在何時寫入char **p = NULL
?辨別指針和內存分配
回答
變量存儲在堆棧上,如果不是static/global。這裏沒有堆內存分配。這只是(非有效的)內存地址。
並且對於p和* p的記憶同樣有效? –
基本上,任何在函數中聲明的變量都會自動分配到棧上,如果不是另有指定的話。如果你有'int p',它是整數存儲在堆棧上。如果你有'int * p',它指向整數的無效指針,指向隨機位置(如果不是在調試版本中),除非你手動指定應該指向的地方。 – keltar
p
的大小取決於它的類型。 *p
和**p
(和***p
,**********p
等)的大小是指針的大小:通常爲4或8個字節,具體取決於您使用的是32位系統還是64位系統。
當您編寫char **p = NULL
時,您不會爲char **p
提供的內容分配額外內存。你只是用一個值來初始化變量在內存中的位置,而不是將它放在未初始化的位置。
至於其中它們是,它取決於上下文。如果這些是函數內的局部變量,那麼當函數被調用時,它們將在堆棧上分配。如果它們是全局變量,它們將被賦予程序數據段中的位置。如果它們是struct
的成員,那麼它取決於您聲明結構類型變量的位置。
當你編寫char **p = NULL;
時,p
將會是一個局部變量(在大多數情況下,在堆棧上,如果它是在一個函數內部定義的話),或者一個全局變量(大多數情況下既不是堆棧也不是堆(從malloc()
分配內存),如果它定義在所有函數之外)。
*p
的位置未定義,因爲您不能合法取消引用NULL指針。
這同樣適用於**p
,因爲您首先需要刪除p
,這是非法的。
依此類推。
- 1. 內存分配指針指向數組和指針指針
- 2. Ç - 指針內存分配
- 3. 雙指針內存分配
- 4. Mips動態內存分配和指針
- 5. 內存分配(指針和堆棧)
- 6. 指針和C內存分配
- 7. 指針和動態內存分配
- 8. 內存分配和NULL指針
- 9. 三重指針和內存分配
- 10. 空指針,內存分配和Valgrind的
- 11. C中的內存分配和指針
- 12. 多分配和零指針分配內存概念
- 13. 如何在內存中分配一個指針內的指針?
- 14. 內存分配函數內指針指針
- 15. c指向指針內存分配的指針
- 16. 爲三指針分配內存
- 17. 分配'this'指針的內存
- 18. python指針內存重新分配
- 19. 指針數組的C++內存分配
- 20. C++中的指針內存分配
- 21. 分配內存的指針結構
- 22. 將內存分配給雙指針?
- 23. 指針內存分配問題
- 24. 分配內存到char指針
- 25. 指針陣列的內存分配
- 26. 對象指針的C++內存分配
- 27. 矢量指針內存分配矢量
- 28. cuda統一內存和指針別名
- 29. 指向C中的結構和內存分配的指針
- 30. 釋放分配給指針的內存vs釋放分配給指針指向的內存
但我猜,當我寫char * p = NULL時,如果這是一個局部變量,並且在全局變量區域中,則4個字節的內存(在32位可尋址系統中)被分配到堆棧中,如果這是全局變量。 –