1.64位机器下的数据类型大小
类型 | 大小 |
char | 1 |
int | 4 |
unsigned int | 4 |
short int | 2 |
float | 4 |
double | 8 |
long | 8 |
long long | 8 |
unsigned long | 8 |
指针变量 | 8 |
2.计算结构体的大小
2.1单个结构体
(1)每个成员变量的起始偏移量为自身大小的整数倍
(2)最终结构体的大小是结构体中最大成员变量的整数倍
#include <stdio.h>
typedef struct
{
char a;
int b;
char c;
}Test;
int main(void)
{
printf("sizeof(Test) = %ld\n",sizeof(Test));
return 0;
}
结构体的内存大小可以计算位1+(3)+4+1+(3)=12;
#include <stdio.h>
typedef struct
{
char a;
char b;
int c;
}Test;
int main(void)
{
printf("sizeof(Test) = %ld\n",sizeof(Test));
return 0;
}
结构体的内存大小可以计算位1+1+(2)+4=8;
通过改变结构体成员变量的顺序,导致最终结构体的大小发生了变化,原因是什么?
2.2嵌套结构体
例子如下:
struct A {
int a;
char b;
int c;
double d;
};
struct P {
struct A w[2];
short b;
struct A* p;
}
首先结构体A的大小为:
4+1+(3)+4+8+(4)=24;最终大小是最大成员变量8(double)整数倍
结构体P的大小为为:
64位机器下:
24*2+2+8+(6)=64;最终大小是最大成员变量8(指针*)整数倍,不是结构体A(24)的整数倍
32位机器下:
24*2+2+4+(2)=56;最终大小是最大成员变量4(指针*)整数倍,不是结构体A(24)的整数倍
3.计算联合体的内存大小
#include<stdio.h>
union
{
char a[11];
double c;
}Test;
int main()
{
printf("sizeof(Test) = %ld\n",sizeof(Test));
return 0;
}
联合体(union)定义了多个成员变量时,这些成员变量将共享同一块内存空间。
改变其中一个成员变量则改变所有成员变量。
因此该联合体的大小为:
11+(5)=16
假设存在联合体为:
union A {
short a;
char buf[4];
} x = {0x01, 0x02, 0x03, 0x04}
在大端字节机器中x.c的值为:
大端字节序:x.a=0x0102
大端字节序:在大端字节序中,最高有效字节(Most Significant Byte,MSB)被存储在内存的最低地址处,而最低有效字节(Least Significant Byte,LSB)被存储在内存的最高地址处。
小端字节序:在小端字节序中,最低有效字节(Least Significant Byte,LSB)被存储在内存的最低地址处,而最高有效字节(Most Significant Byte,MSB)被存储在内存的最高地址处。例如:在上例中:
小端字节序:x.a=0x0403