当前位置: 技术问答>linux和unix
gcc字符对齐问题的研究
来源: 互联网 发布时间:2017-03-07
本文导语: 在一个函数的赋值语句出现赋值错误,其中data是s64 REF是s32 m_info是个结构体 ScaleData也是结构体 s64 nValue = data; m_info.ScaleData[CH].REF[format] = data; 错误信息 假设data值是160 nValue的值是对的160 但m_info.ScaleData[CH].REF[fo...
在一个函数的赋值语句出现赋值错误,其中data是s64 REF是s32 m_info是个结构体 ScaleData也是结构体
s64 nValue = data;
m_info.ScaleData[CH].REF[format] = data;
错误信息
假设data值是160
nValue的值是对的160
但m_info.ScaleData[CH].REF[format]的值就不是160了 有可能很大的值像-167117...
struct s_scale
{
s32 DIV[SET_FORMAT_MAX + 1]; //一格多少
s32 REF[SET_FORMAT_MAX + 1]; //参考
u8 POS; //参考位置, 共享
};
结构体对齐方式采用1字节对齐,如果是4字节对齐则不会出现这个错误。
修改过方法:
1. m_info.ScaleData[CH].REF[format] = (s32)data; 赋值错误
2. s_scale结构体内REF DIV改成s64 赋值错误
3. memcpy(&m_info.ScaleData[CH].REF[format], &data, sizeof(s32)); 赋值正确
这是怎么回事呢?谢谢!
s64 nValue = data;
m_info.ScaleData[CH].REF[format] = data;
错误信息
假设data值是160
nValue的值是对的160
但m_info.ScaleData[CH].REF[format]的值就不是160了 有可能很大的值像-167117...
struct s_scale
{
s32 DIV[SET_FORMAT_MAX + 1]; //一格多少
s32 REF[SET_FORMAT_MAX + 1]; //参考
u8 POS; //参考位置, 共享
};
结构体对齐方式采用1字节对齐,如果是4字节对齐则不会出现这个错误。
修改过方法:
1. m_info.ScaleData[CH].REF[format] = (s32)data; 赋值错误
2. s_scale结构体内REF DIV改成s64 赋值错误
3. memcpy(&m_info.ScaleData[CH].REF[format], &data, sizeof(s32)); 赋值正确
这是怎么回事呢?谢谢!
|
1字节对齐,可以添加填充字符,即 pad
|
s64 nValue = data;
m_info.ScaleData[CH].REF[format] = data;
struct s_scale
{
s32 DIV[SET_FORMAT_MAX + 1]; //一格多少
s32 REF[SET_FORMAT_MAX + 1]; //参考
u8 POS; //参考位置, 共享
}
楼主准备将 s64 数据存储在 s32 中么?
m_info.ScaleData[CH].REF[format] = data;
struct s_scale
{
s32 DIV[SET_FORMAT_MAX + 1]; //一格多少
s32 REF[SET_FORMAT_MAX + 1]; //参考
u8 POS; //参考位置, 共享
}
楼主准备将 s64 数据存储在 s32 中么?
|
看不出问题的,把变量类型都贴来。
|
有无完整代码?是哪种 cpu ?