2015-09-04 49 views
1

我是新的C,這是我的第一個問題: 爲這種結構:指向struct的指針數組中的指針,如果設置爲NULL,是否分配內存?

typedef struct Branch 
{ 
    Tree * thisTree; 
    struct Branch * nodes[]; 
} Branch; 

看來,如果我做做工精細如下:

Branch branch1; 
branch1->nodes[0] = NULL; 

即使我做用於指針NR 0陣列中的未分配內存這種方式:

branch->node[0] = (Branch *) malloc(sizeof(Branch *)); 

如果我檢查與此代碼:

if (branch1->nodes[0] == NULL) 
    printf("is NULL"); 

它輸出到輸出:是NULL

所以我的問題是: 已經存在已爲指針分配的內存?

branch1->nodes[0] 

,因爲我有很多的結構,如果我初始化每個分支有固定數量的指針,我得到了很多分配的數據(如果我用的sizeof功能檢查)。 就是這樣:設置爲NULL(上面)的思路錯誤?

我的問題是,指針的內存分配是4個字節。因此,在數組中沒有聲明的指針數量,它何時爲它分配內存? 對不起 我試圖保持這個問題簡單,但我需要通過結構指針的下一個分支達到一個字符串

這意味着我用的結構是

typedef struct Branch 
{ 
    Tree * thisTree; 
    char *string; 
    struct Branch * nodes[]; 
} Branch; 

所以,如果我不

branch->node[0] = (Branch *) malloc(sizeof(Branch *)); 

,比

branch->node[0]->String = strdup("text"); 

我ge編譯器錯誤。

+0

不要在C. – Olaf

+0

你做投malloc'和朋友的'結果。 C不是Java或Python等。指針不是引用,而是第一類對象。使用valgrind。如果你不這樣做,簡單的比較甚至可能會奏效,你不能依賴_undefined behaviour_ ** not **來產生正確的結果。 – Olaf

+0

我喜歡那些演員。 –

回答

0

不.Null指針沒有分配任何內存來將它存儲在堆上,因爲沒有任何東西需要分配(因此「null」)。

您的節點數組並沒有分配內存來存儲空指針本身,但是它只需要存儲空指針整數,浮點數,結構數組所需的內存就是它的名稱。

+0

我的問題是,指針的內存分配是4個字節。所以沒有在數組中聲明的指針數量,它何時爲它分配內存? – BlindWhiteLabMouse

+0

是的,它必須爲_pointer本身_分配內存。意味着10個整數,10個結構或10個雙精度的數組將分別分配在32位或64位操作系統上分配的40個字節(4個字節* 10)或80個字節(8個字節* 10)。將這些指針設置爲null是**不會分配更多或更少的字節。 – Mirza

+0

這就是問題,有多少?因爲在結構中我沒有指定數組中指針的數量 – BlindWhiteLabMouse

0

本質上,你正在爲指針分配內存,並將值NULL放在那裏,這在C中通常是0.但是該值必須放在分配的內存中,在這種情況下分配給指針,所以是的,仍然會爲指針分配內存,您只需將其值設置爲零即可。

但是,如果您已寫入branch->node = NULL;,但您仍然無法訪問該內存,但這不是正確的方式來移除它,因爲內存仍然分配但無法訪問,您應該使用free(branch->node);取消分配內存,以防你想這樣做。

關於在內存中分配位置的數量,將被時代所定義你成倍的sizeof()功能:

int number = 2; //assume you want two elements 
branch->node[0] = (Branch *) malloc(number*sizeof(Branch *)); 
相關問題