【问题标题】:How can sizeof determine the exact size of a structure im memory if no object of this structure has been created?如果没有创建此结构的对象,sizeof 如何确定结构在内存中的确切大小?
【发布时间】:2020-05-18 09:47:54
【问题描述】:

我在确定结构的大小时遇到​​了一个问题。我发现可以在 sizeof 操作中使用前面的关键字 struct 来确定结构的大小,尽管没有为相应的结构创建对象:

例子:

#include <stdio.h>

int main()
{
   struct struct1
   {
        char a[20];
        int v,i;
        double grw;
   };

   printf("Size of struct1 in Byte: %lu",sizeof(struct struct1));

   return 0;
}

输出:

Size of struct1 in Byte: 40

这怎么可能?

如果尚未创建此结构的对象,sizeof 如何借助 sizeof 操作内的 struct 关键字确定结构的大小?

或者已经创建了一个struct1 对象,我不知道?

我认为结构只是一种数据类型,而不是它自己类型的对象。

【问题讨论】:

  • 如果编译器不知道它的大小,它如何分配struct struct1 类型的对象? (struct 关键字不相关。sizeof(int) 也很好。)
  • 这个 sizeof 只是告诉你创建一个 struct1 类型的“对象”需要多少内存
  • sizeof 从其结构中推断出struct 的大小。

标签: c memory data-structures struct sizeof


【解决方案1】:

除了变长数组,sizeof 不需要类型的实例来计算它的大小,它可以根据类型定义本身来计算它。

在您给出的情况下(如下所示),它实际上知道,仅从该类型定义,对象将有多大(每个单独字段的大小加上每个字段之间对齐所需的任何填充以及最终字段)- cmets 提供了一种可能性:

struct struct1 {
    char a[20];  // 20 bytes @ 0.
    int v,i;     // Two 4-byte values @ 20 (a multiple of 4, so already aligned).
                 // 4 bytes padding to align next 8-byte double.
    double grw;  // 8 bytes @ 32 (a multiple of 8, aligned due to padding above).
};

【讨论】:

    【解决方案2】:

    sizeof 需要能够确定不同类型的大小,否则它不知道在需要时分配多少空间。

    struct 定义表示将使用多少空间。

    一个分配可能是这样的:

    • char a[20]:20 字节。
    • int c, i:每个 16 位,所以 4 个字节。
    • double grw:128 位,所以 16 个字节。

    总计:40 字节

    【讨论】:

    • 这是不正确的。对于大多数编译器,int 是 32 位,不是 16。早期的 8086 使用 16 [和一些 mc68000],但是,现在,32 更通用。但是,更重要的是,double 是 64 位 [8 字节] 而不是 128 位 [16 字节]
    • 小心,@Craig,您不应该将“常见”与“强制”混淆。该标准规定了每种类型(int、double 等)的最低要求,但没有规定最高要求。我什至不确定浮点是否需要 IEEE754 格式,而是选择底层类型的某些 properties (如符号位、范围和精度等)。所以,既然blueteeth说“一个分配可能是这样的”,我相信这个答案其实是正确的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 2012-04-04
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多