结构体总的字节数的理解

作者:超级管理员 更新时间:2017-10-31 10:58:56 来源:未知 点击:15642
大家好,在自学结构体这一节时,书上有这样一个例子:    struct Student    {        int num;        char name[20];        char s
大家好,在自学结构体这一节时,书上有这样一个例子:

    struct Student
    {
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
    };
    struct Student student1;
    printf("%d\n",sizeof(student1));

我想试验一下这个结构体占多少字节,用codeblocks运行后,发现结果为68.这与谭四版的内容不一致。
我百度了一下(搜索关键词sizeof(student1)),按照别人回答的方法,计算了一下:
int num:字节从0-3
char name[20]:字节从4-23
char sex:字节25
int age:字节28-31
float score:字节32-35
char addr[30]:字节36-65
总字节数应该为65。
再参考了谭四版295页的注脚(计算机对内存的管理是以字为单位的),那么,由于65不是4的倍数,故student1占的总字节数为68。
是这样理解的吗?

实际上系统中总是以一定的内存对齐方式处理,比如一般是4字节对齐,那么结构体中间不足4字节倍数的,都会被补足到4字节,比如char sex就不是1字节,而是4字节了。

#include <stdio.h>

int main(void)
{
   struct Student
   {
      int   num;
      char  name[20];
      char  sex;
      int   age;
      float score;
      char  addr[30];
   };
   struct Student student1;
   printf("%d\n", sizeof(student1));

   printf("%p\n", &student1.num);
   printf("%p\n", student1.name);
   printf("%p\n", &student1.sex);
   printf("%p\n", &student1.age);
   printf("%p\n", &student1.score);
   printf("%p\n", &student1.addr);

   return 0;
}

你定义的结构体成员最大的为4个字节,所以成员排列按4字节对齐,不够的插入空余的字节以便对齐
int num:字节从0-3,占4个字节
char name[20]:字节从4-23,占20个字节
char sex:字节24-27,占4个字节,插入3个空余字节
int age:字节28-31,占4个字节
float score:字节32-35,占4个字节
char addr[30]:字节36-67,占32个字节,插入2个空余字节
总字节数应该为4+20+4+4+4+32=68

为什么要对齐呢,这是为了简化读写过程,提高读写速度,CPU在内存和缓存之间交换数据时,可以按块操作,经过对齐的数据可以用尽量少的指令就完成。

不要相信谭,特别是不要仔细看谭

看这篇文章,很清晰
http://www.cnblogs.com/yue-blog/p/5878268.html

看编译器,用sizeof()查看,一般windows是4字节对齐的。

推荐阅读

热门内容

C语言问题求助 求知道这种方式的人给解释

说清楚点吧  我这是常用算法程序集(C/...

已知两条直线和鼠标所在点,求经过鼠标所在

计算公式是有的,但是不同与我们手动计算用...

位数组问题 c和指针第5章第4道题

题目要求主函数是自定义的有两个问题:第一...

用Qt graphics view实现许

这个效果不错,关注。...

无GPU下win764+vs2013安装

在编译build_cpu_only中的M...

cppcms-1.0.5 windows

本帖最后由lovton于2017-10-...

vs2015 字体 不能加粗 什么原因呢

设置了  粗体  可是根本没任何效果这是...

下面的程序输出结果为什么是1111101

class one{public:one...

救急!!!江湖救急!!!拜托各位大佬了!

各位大佬帮忙看一下我写的这个程序出了什么...

为什么在c语言头文件中函数的声明是下划线

本帖最后由MHLAH于2017-10-2...

最新内容

让 Python 更加充分的使用 Sqlite3

  我最近在涉及大量数据处理的项目中频繁使用sqlite3。我最初的尝试根本不涉...

PHP实现网站访问量计数器

简单的网站访问量计数器实现,具体如下首先说明思路:1.用户向服务器发出访问请求2...

2017年中国程序员调查分析:大数据就业前景广阔

  在互联网行业,程序员一直是很受关注的人群。特别对准备步入社会的大学生们来说,...

美国人看待科技巨头:苹果、FB和Twitter最不受信任

  新浪科技讯北京时间10月30日早间消息,自从史蒂夫·乔布斯(SteveJob...

网易:将按照广电总局意见 对“大逃杀”类游戏整改

  “大逃杀”类游戏的火爆,引起了相关部门的注意。  10月27日,中国音数协游...

从四大公司财报看行业走向:云计算业务真的很热

  网易科技讯消息,据路透社报道,亚马逊、微软、Alphabet子公司谷歌以及英...

物联网的应用会让黑客掌控一切吗?

  由于了解一些技术,密码和安全性,行业专家认为其电子设备在防御黑客方面是非常安...

结构体总的字节数的理解

大家好,在自学结构体这一节时,书上有这样一个例子:    struct Stud...

Burp手机抓包使用过程

  写作背景:在上一篇文档中介绍了如何配置手机抓包的全过程,其中有网友留言问配置...

C#基础问题:只读,关于Array.IsReadOnly和IList.IsReadOnly

不清楚为什么问题列表看不到我的问题,无奈再开一贴原题贴以下是关于本问题的解决方案...

md5加密,要加密的串带有特殊字符

现在在做跨境物流,需要接法国物流接口。接口需要传个安全秘钥,这个秘钥就是规定的几...

backgroundWorker关于Winform最简单的线程问题,请求各位指导一下

我想使用backgroundWorker1,启动应用后每隔20秒去读取数据库,看...

一个小问题求助

类似图中数据,要筛选出MesNum与InventoryNum不同的数据该怎么写 ...

WPF 自定义的DependencyProperty属性不被识别

定义了一个多选的Comobox,自定义依赖属性在调用时不被识别,不知道为什么。p...

ArcGis For JavaSrcipt 如何加载shp和dwg和dbf文件?

如何加载?跪求大神指导。并且可以清除掉!!以下是关于本问题的解决方案:...

一条sql语句,把重复记录的字段的值相加

本帖最后由NewCSDN2005于2017-10-2915:35:27编辑acc...

链接带的有?id=xxx,查询结果一直显示id为xxx的咋办?

一个链接,比如www.baidu.com链接要点进去直接显示某个人,而不是所有就...

通过数据库获取 like '%[螺丝]%' 怎么写代码!

通过数据库获取 like '%[螺丝]%' 怎么写代码SELECT top 5 ...

winform客户端界面与其他软件相似,需要修改界面

项目开始的时候,领导一句话照着XXX软件实现这些功能,项目全程就我一个人开发,然...

Dev GridControl 单元格为空验证弹框问题!!! 希望有人能解决了

怎么阻止对话框弹出,并且在有空值得情况下不允许添加新行以下是关于本问题的解决方案...