【问题标题】:What's the size of a structure with zero length array?具有零长度数组的结构的大小是多少?
【发布时间】:2012-09-18 10:41:08
【问题描述】:

我在下面测试一个程序:

#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(红帽 4.6.3-2)

【问题讨论】:

标签: c arrays gcc


【解决方案1】:

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

编辑:此外,您在第二次尝试中使用了指针的大小 :-) 您可能打算在那里使用“sizeof(*node)”之类的东西,这会再次给您“4”。

编辑 2:这也是为什么即使 'Pointer' 从未被初始化或以其他方式无效,您也可以执行 sizeof(*Pointer) 或 sizeof(Pointer->Element) 之类的事情的原因。 sizeof() 不关心任何东西的内容,它只查看表达式的结果类型。

【讨论】:

    【解决方案2】:

    第一: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 版本中无法编译。

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2011-11-07
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多