【问题标题】:sizeof returns different values for a struct when compiling different programssizeof 在编译不同的程序时为结构返回不同的值
【发布时间】:2010-11-05 13:30:45
【问题描述】:

我有 2 个程序共享一个头文件。这个头文件定义了一个包含几个成员的结构。然后有一个#define:#define STRUCTURE_SIZE sizeof(OUR_STRUCTURE)

此结构随后用于共享内存中,STRUCTURE_SIZE 用于 size 参数到 shmget()

不幸的是,对于第一个程序,STRUCTURE_SIZE 最终为 20758,而在另一个程序中,它最终为 20764。因此,当第二个程序尝试获取共享内存时,shmget() 返回 EINVAL。

uname -a:

Linux machine 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP Thu Feb 11 07:05:37 UTC 2010 i686 i686 i386 GNU/Linux

g++ --version:

g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)

【问题讨论】:

  • 发布一些代码。 OUR_STRUCTURE 是什么?
  • 需要定义OUR_STRUCTURE。
  • 我愿意,但我是一个低级的实习生,不知道我是否真的应该。这种结构本质上是系统的核心。
  • 您可以随时匿名成员并输入姓名。

标签: c++ linux gcc shared-memory sizeof


【解决方案1】:

几种可能性:

  • 您正在使用不同的编译器和/或编译器开关编译这两个程序
  • 您有另一个标题出现在其中一个程序的相关标题之前,这与#pragma pack 或类似内容混淆,并且不会恢复设置
  • 在共享结构中使用的类型在两个程序中的定义不同

(注意:最后两点可以递归地应用于问题结构中使用的任何其他结构。)

【讨论】:

  • #pragma pack(8) 已修复。谢谢!
【解决方案2】:

问题可能是包装或对齐问题。了解如何告诉编译器它应该如何对齐结构。

【讨论】:

    【解决方案3】:

    其他可能性:

    • 两个编译中使用的定义集不同,结构是根据这些定义有条件地定义的
    • 某些类型在内核和用户空间中的大小可能不同(这种情况很少见,但也有可能发生)

    【讨论】:

      【解决方案4】:

      你也许可以通过编写一些代码来检查OUR_STRUCTURE中字段的偏移量并打印出来,依次使用两个编译来获得一些理解。分解结构的总大小以确定其每个字段引起的大小。

      struct OUR_STRUCTURE
      {
        double d;
        other_structure other;
        bool flag;
      };
      
      OUR_STRUCTURE ours;
      cout << &ours.d - &ours << endl;
      cout << &ours.other - &ours << endl;
      cout << &ours.flag - &ours << endl;
      cout << &ours + sizeof(OUR_STRUCTURE) - &ours.flag << endl;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多