2015-05-27 34 views
3

是否允許動態分配內存這樣的靜態變量:我們可以動態地爲C中的靜態變量分配內存嗎?

#include <stdio.h> 
#include <stdlib.h> 

struct person 
{ 
    int age; 
    int number; 
}; 

static struct person* person_p = NULL; 

int main() 
{ 
    person_p = (struct person*)malloc(10 * sizeof(struct person)); 
} 

建上面的代碼,但它確實允許動態分配內存的靜態變量?

+1

更重要的是你爲什麼這樣做?你知道函數接受參數!當你的程序增長時,你不會感到困惑! –

+1

你的意思是隻有指針是靜態的? – ratzip

+0

指針本身是靜態的,但是通過指針分配的內存既不知道也不關心它。 –

回答

4

是的,它是有效的和允許的。 (除非您使用指針作爲佔位符)您可以(並且需要)在使用指針之前和之後動態分配內存和指針之間的內存。

相反,請記錄,你do not cast通過指針它

+0

爲什麼如果它是const,它是無效的? – ratzip

+0

@ratzip你不能改變'const'。 :-) –

+1

'const'-ness在這裏是無關的,可能只是混淆了這個問題。 –

0

我不明白爲什麼不。即使靜態意味着只能有一個對象實例,但仍需要該對象的空間。請記住,任何malloc'd需要free'd,所以你會想在你的main()函數結束時做到這一點。

+0

這是C代碼。 你的意思是「所以這個結構可能更適合於在包裝函數或類中可以跟蹤它的銷燬。」 – ratzip

+0

啊是的 - 你是對的。在這種情況下,你會想在main()函數的結尾釋放你的結構。 –

+0

那麼,'靜態'並不意味着你只能有一個對象的實例。這*是一個定義,它定義了一個對象(或者說變量,因爲我們在說C)。 – Gauthier

0

內存不是「擁有」的malloc()返回值和家庭C.。你可以做以下的事情:

  • 動態分配內存
  • 做一個指針指向該內存

它並沒有真正意義地說「動態分配內存指針」。任何指針都可以指向任何對象(受到對齊和別名限制的限制),指針的存儲持續時間是什麼也沒有區別。

+0

是的,謝謝你澄清它 – ratzip

0

請注意,它是指針,它是靜態的,而不是它指向的內存。

static意味着兩個不相關的事情:

  1. 給靜態內存分配(內存在節目的開始分配,只有在程序結束釋放)
  2. 給內部鏈接(不允許其他編譯單元 - 模塊 - 訪問標識符這裏的變量,可以是一個函數)

在代碼中,1靜態內存分配是無關緊要的,因爲變量是全球反正這樣已經擁有它。

然後,2.內部連接也不重要,因爲你試圖做的是在模塊內部。

換句話說,person_p與您模塊中的常用全局變量完全相同,您可以隨心所欲地做任何事情。

它只是由這行代碼定義的指針,因此您可以在其他位置動態分配內存,並根據需要將內存地址分配給person_p

相關問題