簡體   English   中英

零長度數組的結構的大小是多少?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM