社区
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编译。。。
声明均为全局声明。
有人遇到相同情况吗???
...全文
265
10
打赏
收藏
为什么同一结构体在不同程序下长度不同??
先上程序: struct CeilBlockInfo { unsigned char type; long x; long y; long begin; int span; }; 按照字节对齐的优化计算方法,其长度应该是:8+4+4+4=20; 但是在我的另一个程序中计算的结果却是18!百思不得其解。。。。 两个程序都运行在WIN7环境下,但一个是MFC,一个是控制台程序。通过VS2010编译。。。 声明均为全局声明。 有人遇到相同情况吗???
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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语言第11章-
结构体
与共用体.pptx
c语言第11章-
结构体
与共用体.pptx
结构体
0
长度
数组的作用
在标准 C 和 C++ 中,不允许用 0
长度
数组,但在 GNU C 中,却可以定义 0
长度
数组。比如: 引用 structline{ intlength; charcontents[0]; } 0
长度
数组不占有空间,从打印 sizeof (structline) 可以看到这个
结构体
的
长度
为 4,这 4 字节空间属于整型量 length 。那么
结构体
里最后的 0
长度
字符数组 contents[0] 用来做什么呢?答案是,它可以用来指向一...
c语言
结构体
学习整理(
结构体
初始化,
结构体
指针)
c语言中交换两个
结构体
的值(
结构体
指针) 1关于语言的
结构体
: 首先我们为什么要用到
结构体
,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据...
关于sizeof与#pragma pack导致
结构体
大小变化的问题
原文链接:http://www.dreaminto.com/2015/0812/831.html 对于
结构体
,在使用sizeof的时候会进行字节的对齐,对齐的规则如下: 1)
结构体
变量的首地址能够被其最宽基本类型成员的大小所整除; 备注:编译器在给
结构体
开辟空间时,首先找到
结构体
中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为
结构体
的首地址。 2)
结构体
内存分配与sizeof()
结构体
成员的内存分布与对齐 马国峻 maguojun2005@sina.com 我们先看一道IBM和微软的笔试题: IBM笔试题: struct{ short a1; short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof( A)=6,
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章