[英]What's the size of a structure with zero length array?
我在下面測試一個程序:
#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
函數中,我在node
結構中增加了3個整數。 為什么輸出的節點大小仍然為8?
PS:gcc(GCC)4.6.3 20120306(Red Hat 4.6.3-2)
因為sizeof()是一個編譯時的“運算符”,它返回類型的大小。 它不知道甚至不在乎您分配的內容。
編輯:此外,您將在第二次嘗試中使用指針的大小:-)您可能打算在那里使用“ sizeof(* node)”之類的東西,這將再次為您提供“ 4”。
編輯2:這也是為什么即使未初始化“指針”或以其他方式無效的原因,也可以執行諸如sizeof(* Pointer)或sizeof(Pointer-> Element)之類的原因。 sizeof()並不關心任何內容,它只是查看表達式的結果類型。
第一: 不要在C中malloc()
的返回值 。
第二:最好不要重復類型名稱,而應使用向其分配malloc()
:ed指針的左側指針,因為它已經具有類型了。 從而:
node_t *node = malloc(sizeof *node + 3 * sizeof(int));
在此代碼中,對sizeof
運算符表達式的求值是在編譯時完成的,因此從代碼執行中沒有可用的信息。
從C99開始,可以對sizeof
進行部分運行時評估,請參閱Wikipedia文本 。 給出的最基本的示例是:
size_t flexsize(int n)
{
char b[n+3]; /* Variable length array */
return sizeof b; /* Execution time sizeof */
}
上面要求運行時評估sizeof
,因為n
的確切值不是恆定的,在編譯時也不知道。 上述內容無法在C99之前的版本中編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.