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)

4

2 回答 2

7

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

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

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

于 2012-09-18T10:42:58.687 回答
3

第一:不要转换malloc()in C的返回值。

第二:最好不要重复类型名称,而是使用您分配malloc():ed 指针的左侧指针,因为它已经具有类型。因此:

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

在此代码中,sizeof运算符表达式的计算是在编译时完成的,因此在执行代码时没有可用的信息。

从 C99 开始,可以获得 的部分运行时评估sizeof,请参阅此 Wikipedia text。给出的最基本的例子是:

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

以上需要 的运行时评估sizeof,因为 的确切值n不是恒定的,并且在编译时未知。以上内容无法在 C99 之前的版本中编译。

于 2012-09-18T11:07:33.217 回答