2012-09-18 67 views
1

我測試程序如下:零長度陣列結構的大小是多少?

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

typedef struct _node_t { 
    int id; 
    int contents[0]; 
}node_t; 

int 
main(int argc, char* argv[]) 
{ 
    printf("sizeof node_t is: %d\n", sizeof (struct _node_t)); // output: 4 

    node_t *node = (node_t*)malloc(sizeof(node_t) + sizeof(int) * 3); 

    printf("sizeof node is: %d\n", sizeof (node)); // output: 8 

    return 0; 
} 

和節點瞬間的大小爲8。然而,在malloc功能,我把多餘的3個整數到node結構。爲什麼節點大小的輸出仍然是8?

PS:GCC(GCC)4.6.3 20120306(紅帽4.6.3-2)

+0

可能的重複[如果我在C/C++中定義一個0大小的數組會發生什麼?](http://stackoverflow.com/questions/9722632/what -happens-IF-I-限定-A-0尺寸陣列式-CC) – Lundin

回答

7

因爲的sizeof()是一個編譯時 「操作員」,它返回類型的大小。它不知道甚至不關心你的malloc()。編輯:另外,你在第二次嘗試中取指針的大小:-)你可能打算在那裏使用類似「sizeof(* node)」的東西,這會再次給你「4」。編輯2:這也是爲什麼你可以做sizeof(*指針)或sizeof(指針 - >元素)之類的東西的原因,即使'指針'從未被初始化或否則無效。 sizeof()並不關心任何內容,它只是查看錶達式的結果類型。

3

第一個:do not cast the return value of malloc() in C

二:這是更好地重複類型名稱,而是使用你分配malloc()左側指針:ED指針,因爲它已經擁有的類型。因此:

node_t *node = malloc(sizeof *node + 3 * sizeof(int)); 

在這段代碼中,sizeof操作表達式的計算是在編譯時完成的,因而沒有可從代碼的執行信息。

由於C99,可能會得到部分運行時評估sizeof,請參閱this Wikipedia text。給出的最基本的例子是:以上

size_t flexsize(int n) 
{ 
    char b[n+3];  /* Variable length array */ 
    return sizeof b; /* Execution time sizeof */ 
} 

要求sizeof運行時計算,由於n精確值不是恆定的並且在編譯時未知的。以上不會編譯C99以前的版本C.