【问题标题】:sizeof() applied to structure and variablesizeof() 应用于结构体和变量
【发布时间】:2011-09-09 18:14:16
【问题描述】:

考虑以下 sn-p:

struct foo {
  int a;
  int b;
  int c;
};

struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));

代码返回相同的值,但我想知道应用于变量的 sizeof() 是正确的还是只是巧合?

谢谢。

【问题讨论】:

  • 你试过谷歌搜索“sizeof应用于变量”吗?前两个结果(其中一个来自 StackOverflow)本来可以回答您的问题。
  • 是的,两个sizeof 表达式返回相同的值。请注意,第二个不需要括号; sizeof 是运算符,而不是函数。但是%u 需要unsigned int 类型的参数,而不是size_t。写这个:printf("%zu %zu\n", sizeof (struct foo), sizeof f); 或这个:printf("%lu %lu\n", (unsigned long)sizeof (struct foo), (unsigned long)sizeof f);%zu 是 C99 特有的功能;你系统的printf 可能不支持它。

标签: c clang


【解决方案1】:

两者都会并且确实应该返回相同的值。

来自 MSDN:

sizeof 运算符
sizeof 运算符给出了存储操作数类型的对象所需的存储量(以字节为单位)。此运算符允许您避免在程序中指定与机器相关的数据大小。

sizeof unary-expression  
sizeof ( type-name )

【讨论】:

    【解决方案2】:

    sizeof 适用于类型表达式。当您将其应用于类型时,()sizeof 语法的一部分:sizeof(type)。当您将其应用于表达式时,() 不属于 sizeof 语法:sizeof expression

    所以你的第二个sizeof 并没有真正“应用于变量”。它应用于表达式(f)。该表达式由单个变量f 组成,该变量包含在一对冗余() 中。你也可以不用那对冗余的(),而只使用sizeof f

    sizeof 应用于表达式时,它返回表达式结果的大小(即表达式具有的类型的大小)。在您的示例中,sizeof 的两个应用程序都保证评估为相同的值。

    事实上,一个好的编程习惯是尽可能避免使用sizeof(type),即更喜欢使用sizeof expression。这使您的代码更加独立于类型,这始终是一件好事。类型名称属于声明,不属于其他任何地方。

    【讨论】:

      【解决方案3】:

      这正如预期的那样,即两者都将返回相同的值。该值是在编译时计算的。

      使用sizeof 中的变量通常是一个好习惯,因为您以后可能会更改类型,因此大小也可能会更改。

      【讨论】:

        【解决方案4】:

        通常最好将其应用于变量。如果变量的类型发生变化,它将保持正确。

        【讨论】:

        • 这种方式的缺点是,如果将变量的类型从“just struct”更改为“pointer to struct”,那么 sizeof(variable) 将变为 4(或 8,具体取决于架构),编译器将很高兴地接受它,而不告诉你任何警告。
        猜你喜欢
        • 2015-08-19
        • 1970-01-01
        • 2022-04-26
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多