gpt4 book ai didi

c - tm结构的奇怪类型转换问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:27 24 4
gpt4 key购买 nike

当我的数据结构 sSpecificData 包含一个类型为 tm 的字段时,我遇到了以下转换问题:

typedef struct
{
unsigned char data[10000];
} sDataBuffer;

typedef struct
{
int m_Id;
sDataBuffer m_Data;
} sData;

typedef struct {
int m_value1;
int m_value2;
tm m_Date;
} sSpecificData;

const int SPECIFIC_SVC_DATA_SIZE = sizeof(sSpecificData);

typedef struct {
int m_Id;
sSpecificData m_Data;
} sMyData;

int main(void)
{
sData svc;
sMyData* ptr1 = (sMyData*) &svc;
sSpecificData* ptr2;
ptr2 = (sSpecificData*) &svc.m_Data;
ptr1->m_Data.m_value1 = 90;
ptr1->m_Data.m_value2 = 80;
cout << ptr1->m_Data.m_value1 << endl;
cout << ptr1->m_Data.m_value2 << endl;
cout << ptr2->m_value1 << endl;
cout << ptr2->m_value2 << endl;
return 0;
}

没有字段“tm m_Date;”作为 sSpecificData 的一部分,输出是正确的:

90
80
90
80

用字段“tm m_Date;”作为 sSpecificData 的一部分,输出是错误的:

90
80
0 <-- !
90 <-- !

当有类型为 tm 的字段作为 sSpecificData 的一部分时,为什么我的示例不起作用?有什么想法吗?

谢谢!

最佳答案

这与结构打包有关。通过将 tm 字段添加到 sSpecificData,您可以将其从自然对齐 int(4 字节)的结构更改为自然对齐 8 字节的结构。

所以 tm 作为 sSpecificData 的一部分,结构 sMyData 实际上就是这样

typedef struct {
int m_Id;
// 4 bytes of padding inserted to align sSpecificData on an 8 byte boundary.
sSpecificData m_Data; // with tm, this has a alignment of 8
} sMyData;

这解释了你所看到的。要解决此问题,您可以向 sMyData 和 sData 添加一个显式填充值。

typedef struct
{
int m_Id;
int m_padding;
sDataBuffer m_Data; // this accepts structures with an alignment of up to 8
} sData;

typedef struct {
int m_Id;
int m_padding;
sSpecificData m_Data; // with tm, this has a alignment of 8
} sMyData;

或者您可以使用#pragma pack(4)(如果您的 c 编译器支持它)强制将填充排除在 sMyData 之外,但这将导致 tm 未对齐这不是一个好主意。请参阅此相关问题。

今天出现了一个关于 C# 的非常相似的问题,但问题是相同的(尽管指定包装的语法不同) Size of structures in .NET

关于c - tm结构的奇怪类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com