条件(先看一下各个基本类型都占几个字节):

void size_(){
printf("char类型:%d\n", sizeof(char));
printf("int类型:%d\n", sizeof(int));
printf("float类型:%d\n", sizeof(float));
printf("double类型:%d\n", sizeof(double));
return;
}

结果:


先来一下, 这个结构体在内存中占有多少个字节的内存呢?

typedef struct mystruct{  /*结构1*/
int i_int;
char c_char;
char s_char[];
}MYSTRUCT;

这个呢(交换数据成员顺序)?

typedef struct mystruct{   /*结构体2*/
char c_char;
int i_int;
char s_char[];
}MYSTRUCT;

现在让它自己告诉我们

int main()
{
MYSTRUCT my_st = {};
int size_struct = sizeof(my_st);
printf("%d\n", (int)&my_st.i_int);
printf("%d\n", (int)&my_st.c_char);
printf("%d\n", (int)my_st.s_char);
printf("占用内存大小:%d 个字节\n", size_struct); return ;
}

首先看结构体1的结果

可以看出:int占有4个字节, char占有了1个字节, 那么后面char类型的数组占有了11个字节

这是什么鬼?明明定义了char数组长度为9为什么会是11

别着急继续向下看

查看结构体2的结果(难道不是16?)

哈哈, 竟然又出来个20


揭晓答案

这是因为结构体的存储存在内存对齐机制,也就是  < 结构体大小能被最宽基本类型成员大小所整除 >

基本类型指的是 char  int  double 等,这样的对齐机制使得寻址更加方便


为什么结构体1占有16个字节

因为单个char成员会与其下面的char类型数组组合在一起  也就是相当于一个char类型的长度为10的数组

其中最宽基本类型为 int  占4个字节  而后面的 ”char[10]“数组要满足是int占有4个字节的整数倍最小的就是12, 所以共16个字节


为什么结构体2占有20个字节

第一个成员为char单个字符, 其后面是一个int类型,不能结合故要给char分配4个字节

后面的char数组当然还要分配12个字节, 所以4+4+12=20个字节


了解了对齐机制后再来分析一个

typedef struct mystruct{   /*结构体3*/
char c_char;
double d_double;
int i_int;
char s_char[];
}MYSTRUCT;

分析

最宽基本类型是 double 占有8个字节----------------------------------------------------------------8

第一个char占有1个, 但是要补齐为8个字节---------------------------------------------------------8

后面的int占有4个,相当于4个char类型,与char数组结合为 ”char[4+9]“ , 要补齐为16个字节----16

得到结果-------------------------------------------------------------------------------------------32

验证一下

果然就是这样


本节完......

C语言结构体在内存中的存储情况探究------内存对齐的更多相关文章

  1. String在内存中如何存储(Java)

    JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...

  2. Java变量在内存中的存储

    目录 Java变量在内存中的存储 成员变量 局部变量 总结 Java变量在内存中的存储 以下探究成员变量和局部变量在内存中的存储情况. package com.my.pac04; /** * @aut ...

  3. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  4. C语言 结构体的内存对齐问题与位域

    http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地 ...

  5. C语言结构体的内存对齐问题

    在C语言开发当中会遇到这样的情况: #include <stdio.h> struct test { int a; char b; }; int main(int argc, const ...

  6. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

  7. C语言结构体及其内存布局

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  8. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  9. C语言-结构体struct-联合体union-枚举enum

    结构体 在Java中,我们要表示一个复合的数据类型就会使用对象去封装.而C就有结构体. 结构体是C语言中自定义的数据类型,是一组变量的集合,有别于数组,数组仅限于同一种数据类型,而结构体可以是任何数据 ...

随机推荐

  1. 伤不起:File.toPath() & Paths.get()

    java.nio.file.Path这个类应该是从java7才开始有的. 通过File类有两个方法可以转换成Path. 1. Path p = Paths.get(file.toURI());  // ...

  2. LeetCode 6罗马数字转整数

    罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列 ...

  3. Golang的字符编码介绍

    Golang的字符编码介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go里面内建仅支持UTF8字符串编码,因此如果你用fmt.Printf之类的函数无法将GBK,GB2312 ...

  4. 金融量化分析【day110】:Pandas-DataFrame读取与写入

    一.DataFrame DataFrame是一个表格型的数据结构,含有一组有序的列 DataFrame可以被看作是有Series组成的字典并且工用一个索引 1.创建方式 pd.DataFrame({' ...

  5. openstack项目【day23】:虚拟化介绍

    本节内容 一 什么是虚拟化 二 为何要学习虚拟化 三 虚拟化技术主要分类(了解) 四 平台虚拟化技术又可以细分(了解) 一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让 ...

  6. git 学习小记之图形化界面客户端

    习惯了 Windows 的用户,一直不喜欢用类似命令行的东西来操作,当然我也不是不喜欢,只是操作太慢了.也许 Linux 大神在命令行的帮助下,办事效率翻倍,那也是非常常见的事情..当然我不是大神,所 ...

  7. JS面向对象编程之对象(简化版)

    上次网上看了一篇这个文章,然后乱七八糟晕头转向把我晕的够呛.看了半天没找到错的地方但是浏览器Hello world就是没有定义...我也是醉了,最后发现我认为是废话的话一句话竟然有用!!!所以我还是简 ...

  8. [转载]CSS Tools: Reset CSS

    http://meyerweb.com/eric/tools/css/reset/ The goal of a reset stylesheet is to reduce browser incons ...

  9. 关于SQL注入,你应该知道的那些事

    戴上你的黑帽,现在我们来学习一些关于SQL注入真正有趣的东西.请记住,你们都好好地用这些将要看到的东西,好吗? SQL注入攻击因如下几点而是一种特别有趣的冒险: 1.因为能自动规范输入的框架出现,写出 ...

  10. Myeclipse/STS 首次在本地部署配置一个Spring MVC 项目 (十二)

    1. 在本地新创建一个文件夹 ,做为项目工作空间; 2. 用 Myeclipse 或 STS 进入该文件夹,该文件夹就成为项目的工作空间: 3. 就要进 窗口-首选项,配置: 环境默认编码: 1> ...