微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当编译不同的程序时,sizeof返回一个结构体的不同值

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

然后将此结构用于共享内存中,其中STRUCTURE_SIZE用于shmget()的size参数。

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

uname -a :

如何使用内存映射文件在同一台计算机上的服务器和客户端之间进行通信?

IPC共享内存和线程内存之间的性能差异

删除Linux上的所有共享内存和信号量

我可以超过tmpfs的大小运行

命令检查消息队列和共享内存在Linux中的状态?

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)

C ++从共享内存中读取

共享内存:密钥和ID有什么区别?

如何保护两个进程之间共享内存中的string?

为什么使用shm_open?

无root权限实现共享内存

一些可能性:

你正在用不同的编译器和/或编译器开关来编译这两个程序

你有另一个标题出现在其中一个程序的标题之前,这与#pragma pack或类似的混乱,不会恢复设置

在这两个程序中,在共享结构中使用的类型是不同的

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

问题可能是打包或对齐问题。 找出如何告诉你的编译器如何对齐结构。

其他可能性:

在两个编译中使用的定义集是不同的,并且在这些定义上有条件地定义结构

有些类型在内核和用户空间中可能有不同的大小(这很少见,但可能会发生)

您可以通过编写一些代码来检查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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐