Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sizeof在编译不同的程序时为结构返回不同的值_C++_Linux_Gcc_Shared Memory_Sizeof - Fatal编程技术网

C++ sizeof在编译不同的程序时为结构返回不同的值

C++ sizeof在编译不同的程序时为结构返回不同的值,c++,linux,gcc,shared-memory,sizeof,C++,Linux,Gcc,Shared Memory,Sizeof,我有两个程序共享一个头文件。此头文件定义了一个包含几个成员的结构。然后有一个#define:#define STRUCTURE\u SIZE sizeof(我们的结构) 然后,此结构在共享内存中使用,structure\u SIZE用于SIZE的shmget()参数 不幸的是,对于一个程序,结构_大小最终为20758,而在另一个程序中,结构_大小最终为20764。因此,当第二个程序尝试获取共享mem时,shmget()返回EINVAL uname-a: Linux机器2.6.30.10-105.

我有两个程序共享一个头文件。此头文件定义了一个包含几个成员的结构。然后有一个#define:
#define STRUCTURE\u SIZE sizeof(我们的结构)

然后,此结构在共享内存中使用,
structure\u SIZE
用于
SIZE
shmget()
参数

不幸的是,对于一个程序,结构_大小最终为20758,而在另一个程序中,结构_大小最终为20764。因此,当第二个程序尝试获取共享mem时,
shmget()
返回EINVAL

uname-a

Linux机器2.6.30.10-105.2.23.fc11.i686.PAE#1 SMP周四2月11日07:05:37 UTC 2010 i686 i686 i386 GNU/Linux

g++--版本

g++(GCC)4.4.120090725(Red Hat 4.4.1-2)
几种可能性:

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

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

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

其他可能性:

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

您可以通过编写一些代码来检查
我们的\u结构中的字段偏移量,然后依次使用这两种编译将其打印出来,从而获得一些理解。分解结构的总大小,以确定其每个字段引起的大小

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;
struct我们的结构
{
双d;
其他结构;
布尔旗;
};
我们的组织结构是我们的;

不能发布一些代码。我们的大学结构是什么?我们需要对大学结构进行定义。我会的,但我是一个低级实习生,不知道我是否真的应该。从本质上说,这个结构是系统的核心。您可以始终匿名化成员和类型名称。
#pragma pack(8)
修复了它。谢谢