长度为零的结构的大小是多少?

时间:2012-09-18 10:41:09

标签: c arrays gcc

我在下面测试一个程序:

#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(Red Hat 4.6.3-2)

2 个答案:

答案 0 :(得分:7)

因为sizeof()是一个返回类型大小的编译时“运算符”。它不知道甚至不关心你malloc()编辑。

编辑:此外,你在第二次尝试中占用指针的大小:-)你可能想在那里使用类似“sizeof(* node)”的东西,这样会再次给你“4”。 / p>

编辑2:这也是你可以做一些像sizeof(*指针)或sizeof(指针 - &gt;元素)的东西的原因,即使'指针'从未被初始化或者无效。 sizeof()并不关心任何事物的内容,它只是查看表达式的结果类型。

答案 1 :(得分: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的确切值不是常量且在编译时不知道。以上内容不会在C的C99之前的版本中编译。