今天在对之前Cygwin下编译调用Windows动态链接库的项目()进行调试的时候发现有一个数据结构里的值总是出错,经过一番调试之后发现是不同环境对结构体内存布局解析不同导致的.
问题1
描述
现在我有这么一个结构体student
,我用它在DLL(Windows编译)和APP(Cygwin编译)之间交换数据;
1 |
|
现在我在DLL中对其进行赋值,并随后在APP调用DLL方法时,将该结构体的某个实例返回给APP.
1 |
|
现象
其中name
age
gender
的输出都如期,唯独score
值始终都无法正确读取.
为每个变量添加地址信息打印:
1 |
|
最后发现问题出现在CLASS
结构体中.
分析
依据对结构体内存的分析:
name
为指针类型,在x86机器上为64位,8Byte;
age
为int类型,32位,4Byte;
gender
本质为int类型,32位,4Byte;
class
为CLASS类型,大小存疑;
score
为int类型,32位,4Byte;
实际两边地址打印如下:
1 |
|
1 |
|
问题就出在score,在APP(Cygwin编译)中去score的值时,由于CLASS为空,它直接取了CLASS的值,而在DLL(windows编译)则为其保留了4Byte空间.
问题2
描述
由于再Windows下和Cygwin下对结构体位域的处理不同,导致的数据解析失败,结构体示例如下:
1 |
|
内存分布如下:(注意,%p无法打印位域的地址)
1 |
|
由此可见,在Windows下编译的DLL给位域分配了两个字节,而cygwin 下只分配了一个.