社区
C++ 语言
帖子详情
为什么同一结构体在不同程序下长度不同??
y601539388
2012-03-26 02:10:12
先上程序:
struct CeilBlockInfo
{
unsigned char type;
long x;
long y;
long begin;
int span;
};
按照字节对齐的优化计算方法,其长度应该是:8+4+4+4=20;
但是在我的另一个程序中计算的结果却是18!百思不得其解。。。。
两个程序都运行在WIN7环境下,但一个是MFC,一个是控制台程序。通过VS2010编译。。。
声明均为全局声明。
有人遇到相同情况吗???
...全文
357
10
打赏
收藏
为什么同一结构体在不同程序下长度不同??
先上程序: struct CeilBlockInfo { unsigned char type; long x; long y; long begin; int span; }; 按照字节对齐的优化计算方法,其长度应该是:8+4+4+4=20; 但是在我的另一个程序中计算的结果却是18!百思不得其解。。。。 两个程序都运行在WIN7环境下,但一个是MFC,一个是控制台程序。通过VS2010编译。。。 声明均为全局声明。 有人遇到相同情况吗???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Mei
2012-03-26
打赏
举报
回复
直接在每次运行的时候都先执行: sizeof(int); sizeof(long) sizeof(CeilBlockInfo)这样子一目了然了嘛
愤怒的熊猫007
2012-03-26
打赏
举报
回复
在MFC下有可能是按照UNCODE所以unsigned char 是控制台下的两倍。
nice_cxf
2012-03-26
打赏
举报
回复
[Quote=引用 6 楼 virtualdesktop 的回复:]
引用 5 楼 mosal 的回复:
如果都是4字节对齐 自然是20 。不是20绝对编译器有问题。关键是 你确定是4字节对齐么。18只能说是2字节对齐了。我觉得 你只要知道字节对齐的计算方法就够了,用的时候根据自己需求!
...... 在64位系统下面,光sizeof(long)就等于8了,如何“不是20绝对编译器有问题”
楼主的问题,是因为控制台程序在编译时按照16位系统设定……
[/Quote]
如果是你说的,那么你怎么解释结果18?已经说过既然是18,自然long和int必然是4字节,显然是程序在那里设置按2字节对齐了
VirtualDesktop
2012-03-26
打赏
举报
回复
[Quote=引用 5 楼 mosal 的回复:]
如果都是4字节对齐 自然是20 。不是20绝对编译器有问题。关键是 你确定是4字节对齐么。18只能说是2字节对齐了。我觉得 你只要知道字节对齐的计算方法就够了,用的时候根据自己需求!
[/Quote]
...... 在64位系统下面,光sizeof(long)就等于8了,如何“不是20绝对编译器有问题”
楼主的问题,是因为控制台程序在编译时按照16位系统设定进行编译,这个时候sizeof(long)=sizeof(int)=2
mosal
2012-03-26
打赏
举报
回复
如果都是4字节对齐 自然是20 。不是20绝对编译器有问题。关键是 你确定是4字节对齐么。18只能说是2字节对齐了。我觉得 你只要知道字节对齐的计算方法就够了,用的时候根据自己需求!
nice_cxf
2012-03-26
打赏
举报
回复
如果是默认设置,无论int还是long是几个字节,结果都不可能是18
应该是对齐方式被设置为2字节对齐了,没有其他可能
RabbitLBJ
2012-03-26
打赏
举报
回复
应该系统优化了吧,感觉18字节的很奇怪,等高人指点了,帮顶了
y601539388
2012-03-26
打赏
举报
回复
呵呵,谢谢大家热心的解答,我把结构体以二进制输出到文本里,之后用UEDIT查看,发现18是按照二字节对齐的。编译器在usigned char对应的字节后面添加了一个0XCC的值进行了补齐。。。
另外抱歉一点,我书写的问题,是MFC为18位,控制台程序为20位。
现在我在查找为何我的MFC程序会被设置为2字节对齐?。。。。
VirtualDesktop
2012-03-26
打赏
举报
回复
另外,多说一句,int long 的长度都不是固定的,根据你的操作系统的位数而不同,对于32位系统,得到的是20,64位则是40。还有,字节对齐的字节长度也是可调的。所有这些都会影响sizeof的结果。
VirtualDesktop
2012-03-26
打赏
举报
回复
控制台程序按照16位编译,sizeof(int)你看看是不是2
C语言
结构体
长度
的计算
本文详细解析了C语言中
结构体
成员变量如何进行内存对齐,通过具体实例介绍了
不同
数据类型的偏移量计算方法,并给出了两种
不同
的成员排列顺序对
结构体
总
长度
的影响。
C# Struct
结构体
里数组
长度
的指定
本文详细解析了如何在C#中正确定义
结构体
以匹配C++的
结构体
布局,包括解决字节对齐、数组
长度
指定等问题,确保跨语言数据通信的准确性。
结构体
为什么要内存对齐
内存对齐是为了提高
程序
的运行效率和可移植性,确保数据在特定硬件上正确读取。对齐规则通常基于数据类型和平台指定的对齐参数。
结构体
成员按照最小对齐数和自身
长度
较小者对齐,
结构体
整体则按最大成员
长度
和指定对齐数较小者对齐。通过实例解析了
结构体
A和B的内存布局,展示了内存对齐的重要性。
(详解)
结构体
和共用体
本文主要复习了C语言中
结构体
和共用体的相关知识。介绍了两者在内存分配上的区别,
结构体
各成员占用
不同
内存,共用体所有成员占用
同一
段内存。还阐述了
结构体
变量的定义、成员变量的获取和赋值,以及
结构体
与指针的使用,同时讲解了共用体的定义和特点。
结构体
定义使用及指针
长度
问题
本文详细探讨了C语言中
结构体
的定义问题,包括如何避免`dereferencing pointer to incomplete type`错误,以及
结构体
指针的使用注意事项,如必须先赋值或分配内存。同时,文章讲解了指针
长度
的问题,指出指针
长度
不代表其所指向内存的大小,并通过示例展示了sizeof和strlen的区别。最后,总结了指针与数组的主要差异,强调了数组的容量固定和指针的动态特性。
C++ 语言
65,212
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章