存储模式: 计算机的存储空间是按照字节寻址的,多字节的数据在存储空间上是连续的,其数据对象的地址等同于其最低位字节的地址。
例如:int a ;一个 int类型的变量占4个字节,假设变量的地址是0x1000(a),则这个变量所占4个字节的地址分别为:0x1000,0x1001,0x1002,0x1003.将一个整数存储在这个变量中时,哪个字节存在高位那个字节存在低位,根据系统而定,取决于系统的存储模式!
大端模式(Big Endian):数据的高位存放在低地址字节中,地位存放在高地址字节中。
小端模式(Little Endian):数据的高位存放在高地址字节中,低位存在低地址字节中。
写个程序测试一下:
1 #include<stdio.h> 2 3 /*检测内存是大端模式还是小端模式 4 *大端模式:顺着输出a,即为:数据的高位在内存的低地址字节中 5 *小段模式:反着输出a,即为:数据的高位在内存的高地址字节中 6 */ 7 8 9 main() 10 { 11 int a; 12 char *p; 13 a=0x12345678; 14 p=(char *)&a; 15 printf("%#x\n",*p); 16 printf("%#x\n",*(p=p+1)); 17 printf("%#x\n",*(p=p+1)); 18 printf("%#x\n",*(p=p+1)); 19 }
输出:
0x78 0x56 0x34 0x12
所以是小端模式,数据的低位78,存在内存低地址字节中p开始为低地址。小端模式反着输出!0x12345678,输出78 56 34 12
结构体: 结构体变量定义时,结构体内的每一个成员都单独占用自己的空间。存在字节对齐问题。
1 #include<stdio.h> 2 3 struct stp 4 { 5 char str[8]; 6 int a; 7 float f; 8 }; 9 struct stp st; 10 struct stp1 11 { 12 char str[9]; 13 int a; 14 float f; 15 }; 16 struct stp1 st1; 17 main() 18 { 19 printf("%d\n",sizeof(st)); 20 printf("%d\n",sizeof(st1)); 21 }
输出16,20.
why??看下面例子:
1 #include<stdio.h> 2 /* 结构体字节对齐,满足两个条件:1,成员起始地址%每个成员大小==0,如果 3 不为0就补空字节,直到该条件满足。2,最后的结构体长度为结构体自身对齐值 4 的整数倍(自身对齐值为结构体中最长的成员的长度),否则就补空字节*/ 5 6 /* 同样的结构体,成员按由大到小排列能够节省空间*/ 7 8 9 struct TestStruct1 10 { 11 char c1; 12 short s; 13 char c2; 14 int i; 15 }a; 16 17 struct TestStruct2 18 { 19 int i; 20 short s; 21 char c2; 22 char c1; 23 }b; 24 25 main() 26 { 27 printf("%d\n",sizeof(a)); 28 printf("%d\n",sizeof(b)); 29 }
输出12,8
共用体:共用体所有成员共用一块内存空间,所以数据成员具有相同的起始地址,所以,某段时间内只有一个成员其作用!按长度最大的成员分配空间。
例如:
1 #include<stdio.h> 2 3 union utp 4 { 5 char str[5]; 6 int a; 7 float f; 8 }; 9 union utp u; 10 11 main() 12 { 13 u.a=1; 14 printf("%c\n",u.str[0]); 15 }
输出乱数。共用体元素共用一块地址,a的值为 0000 0000 0000 0001,因此str[0]的值为1的一个字节,是高位字节还是低位字节??根据电脑的存储模式定。若是小端模式:str[0]为0001.低位存在低地址当中。 因此输出0000对应的字符,%d的话输出1.