上一节, 我们简单的介绍了结构体的一些知识点, 以及一些注意的事项, 这次我们来看看结构体是怎么样在内存存储的~
我们来看一个小例子:
#include <stdio.h> int main() { struct Date { int year; double dou; int month; int day; }; struct Date D = {2014, 1.2, 9, 10}; int c = sizeof(D); printf("size = %d ", c); return 0; }
输出的结果;
按照我们对类型来算, 3个int类型是12, 再加上一个double类型, 应该是20才对, 那为什么会24呢?
其实啊, 在结构体里, 是按照最长的类型倍数来存储的, 而这4个类型里面最长的就是double, 所以是输出24, 看看下面的示意图吧;
在结构体上, 这样子叫做对齐算法, 也可以成为补齐算法, 以最大的那个类型的倍数来存储, 不够存就添加都一个最长的, 哪怕是多余, 也不会理会~~
下面还有一个例子:
#include <stdio.h> int main() { struct Date { int year; int month; int day; }; // 2.定义结构体变量(真正分配存储空间) struct Date d1 = {2011, 4, 10}; struct Date d2 = {2012, 8, 9}; // 会将d1所有成员的值对应地赋值给d2的所有成员 d2 = d1; printf("d1 = %d - %d - %d ", d1.year, d1.month, d1.day); printf("d1的地址为:%p ", &d1); printf("d2 = %d - %d - %d ", d2.year, d2.month, d2.day); printf("d2的地址为:%p ", &d2); return 0; }
输出的结果:
虽然代码里d1把值都赋给了d2, 但是它们也是互不相关的, 它们两个是独立的两个整体, 在后面随意怎么修改它们任意一个的值, 另一个也不会因为这样子而改变里面的值.
好了, 这次我们就讲到这里, 下次我们继续~~~