当前位置:  技术问答>linux和unix

自定义的一个结构,sizeof时长度不对,不知为什么?

    来源: 互联网  发布时间:2015-03-05

    本文导语:  #include  typedef struct{ unsigned int ID; unsigned char Code; unsigned char Name[20]; }student; int main(void) { printf("sizeof(student) = %dn",  sizeof(student)); return 0; } 结果为:sizeof(student) = 28; 为什么不是25,请赐教?(编译器为gcc) ...

#include 

typedef struct{
unsigned int ID;
unsigned char Code;
unsigned char Name[20];

}student;

int main(void)
{
printf("sizeof(student) = %dn",  sizeof(student));

return 0;
}

结果为:sizeof(student) = 28;

为什么不是25,请赐教?(编译器为gcc)

|
这种情况是出现在我们使用的32位机上的,
你看
sizeof(int)= 4
sizeof(char)= 1
一个char占1个字节,int占4个字节
但是你的结构的排列方式决定第二个char的后面要浪费3个字节
不信,你可以这样定义
typedef struct{
unsigned int ID;
unsigned char Code[2];
                           ~~~
unsigned char Name[20];

}student;
它同样还是28
内存中排列应该是
___ ___ ___ ___ 每一排4个字节
___ ___ ___ ___
4个字节一排
你的结构中ID自己刚好占一排
Code占第二排的第一个字节,但是浪费了后面的3个字节
Name自己占第三派往后的5排


|
#pragma pack(1) /* 到#pragma pack()之间的代码,编译器不优化 */

typedef struct{
unsigned int ID;
unsigned char Code;
unsigned char Name[20];

}student;

#pragma pack() /* 恢复原来的优化状态 */
这样就符合你预计的大小了

|
是数据成员alignment!
可用 yxiangzi(箱子) 信誉:100 得分:0 的方法对一段代码高定,在vc中
通过project/setting/c_c++/code generation/struct member alignment 一次性设定。

|
这是编译器优化,内存对齐所得到的结果.不足4个字节的会用4个字节补齐.

|
你的name原来是一个数组,会被自动对齐,
改成char以后,编译器认出连续三个char可以不分别对齐

|
是字节对齐问题,在编译选项里可以强制指定按照16位int型编译。并且不优化

|
编译器要为每一个变量或是数据单元按其对界条件分配空间,int(ID)占用四个字节,char(code)占用一个字节,但是后面的连续三个字节不能够分配给Name,要跳过去。
所以,是4+4+20=28

|
不对,code 和name之间是没有间隙的,不信你可以打印地址看一下。
关键是name后还必须留空隙,以便对齐整个结构。
只要你想一下这个数组的空间就明白为什么是28了,
struct student  xxx[2];
xxx[1]是必须四字节对齐的,那么应该给xxx[0]分配多大啊?


你把student的ID改为short试一下,就明白了。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.awt类radialgradientpaint的类成员方法: getradius定义及介绍
  • 请问可以用宏定义定义一个二维数组吗?
  • java命名空间javax.xml.stream类xmlinputfactory成员方法: seteventallocator定义参考
  • 想修改路径定义,想找到在哪里定义的,应该怎么办?
  • java命名空间java.text接口attributedcharacteriterator的类成员方法: getallattributekeys定义及介绍
  • php定义数组和使用示例(php数组的定义方法)
  • java命名空间java.beans接口propertyeditor的类成员方法: supportscustomeditor定义及介绍
  • 上次问题解决了,原来是extern被重定义了。。。天阿,关键字也可以被重定义。。。。。欢迎接分
  • java命名空间javax.swing类jtextarea的类成员方法: getcolumnwidth定义及介绍
  • 如何定义一个可变参数的自定义函数
  • java命名空间javax.swing类jtextfield的类成员方法: getcolumnwidth定义及介绍
  • 下面的变量我都下了定义,为什么还出现没定义的信息
  • java命名空间javax.swing类actionmap的类成员方法: allkeys定义及介绍
  • oracle异常(预定义异常,自定义异常)应用介绍
  • java命名空间javax.swing类inputmap的类成员方法: allkeys定义及介绍
  • 为什么我在头文件time.h里找不到time_t的定义呢?只有这个定义typedef __time_t time_t;
  • java命名空间javax.rmi.corba接口valuehandler的类成员方法: iscustommarshaled定义及介绍
  • 函数有定义怎么提示没有低能定义的错误呢?
  • java命名空间javax.swing类jcomponent的类成员方法: resetkeyboardactions定义及介绍
  • android自定义控件和自定义回调函数步骤示例
  • java命名空间java.beans接口customizer的类成员方法: setobject定义及介绍
  • 自定义公共类的装载,包的定义


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3