2012-09-25 102 views
0

p*p**p什麼是內存分配(如果有的話)以及它們在何時寫入char **p = NULL辨別指針和內存分配

+0

但我猜,當我寫char * p = NULL時,如果這是一個局部變量,並且在全局變量區域中,則4個字節的內存(在32位可尋址系統中)被分配到堆棧中,如果這是全局變量。 –

回答

1

變量存儲在堆棧上,如果不是static/global。這裏沒有堆內存分配。這只是(非有效的)內存地址。

+0

並且對於p和* p的記憶同樣有效? –

+0

基本上,任何在函數中聲明的變量都會自動分配到棧上,如果不是另有指定的話。如果你有'int p',它是整數存儲在堆棧上。如果你有'int * p',它指向整數的無效指針,指向隨機位置(如果不是在調試版本中),除非你手動指定應該指向的地方。 – keltar

4

p的大小取決於它的類型。 *p**p(和***p,**********p等)的大小是指針的大小:通常爲4或8個字節,具體取決於您使用的是32位系統還是64位系統。

當您編寫char **p = NULL時,您不會爲char **p提供的內容分配額外內存。你只是用一個值來初始化變量在內存中的位置,而不是將它放在未初始化的位置。

至於其中它們是,它取決於上下文。如果這些是函數內的局部變量,那麼當函數被調用時,它們將在堆棧上分配。如果它們是全局變量,它們將被賦予程序數據段中的位置。如果它們是struct的成員,那麼它取決於您聲明結構類型變量的位置。

0

當你編寫char **p = NULL;時,p將會是一個局部變量(在大多數情況下,在堆棧上,如果它是在一個函數內部定義的話),或者一個全局變量(大多數情況下既不是堆棧也不是堆(從malloc()分配內存),如果它定義在所有函數之外)。

*p的位置未定義,因爲您不能合法取消引用NULL指針。

這同樣適用於**p,因爲您首先需要刪除p,這是非法的。

依此類推。