今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式
例如:
1 #include<stdio.h> 2 struct test1 3 { 4 int a; 5 char b; 6 short c; 7 double d; 8 }; 9 int main() 10 { 11 printf("%d\n",sizeof(struct test1)); 12 13 return 0; 14 }
在这段程序中
输出的并不是 15 //结构体集合内元素大小的简单相加
而是 16 //此处就体现了在c语言结构体中内存开辟的原则 对齐原则
结构体对齐: 以最大的基本元素的大小(除数组)对齐,以本段程序为例:
1. 系统找到结构体内最大元素的大小(double的大小),并以此先开辟一个空间,此空间内存下double类型;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
first
2.再开辟一个最大元素的大小空间,依次找第二大的元素,并存入double大小的空间内,5678内存下int类型;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
second
3.余下的四个空间内能存入short,12内存下short类型;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
second
4.余下的两个空间内能存入char,4内存下char类型
2 | 3 | 4 | 5 | 6 | 7 | 8 |
second
至此结构体内元素全部存完,一共开辟了两次也就是 16个字节的大小 注:此处为什么int要存在5678,以及char存在4,这两个类型都不按顺序存储,有待研究。
为什么当初c语言开发时结构体采取一个这样的方式进行存储?在查询一些资料后,我总结有以下原因:
2019-04-17 22:45:14 寝室随笔
如对本文有疑问, 点击进行留言回复!!
C语言字符数组应用示例1:编写一个程序,将两个字符串连接起来,不用strcat函数。
网友评论