一、struct的字节对齐问题
64位ubuntu系统
1.
vi test.c
#include <stdio.h>
struct node
{
int b; //4
long a; //64bitcpu 8;32bitcpu 4
char c[2]; //2
//short d; //2
//int d;
}*Lnode;
int main()
{
printf("sizeof(struct node) is %d\n",sizeof(struct node));
printf("sizeof(long) is %d,sizeof(int) is %d\n",sizeof(long),sizeof(int));
printf("Lnode is 0x%x,Lnode+3 is 0x%lx\n",Lnode,Lnode+3);
return 0;
}
gcc -g -o test test.c
./test的结果
sizeof(struct node) is 24
sizeof(long) is 8,sizeof(int) is 4
Lnode is 0x0,Lnode+3 is 0x48
分析:
int b;占用4字节
long a;占用8字节
char c[2];占用2字节
由于字节对齐,该结果struct node共占用24个字节。
Lnode+3相当与加了3*24=72字节;转换成16进制是0x48。
2.调换下位置
vi test.c
#include <stdio.h>
struct node
{
char c[2]; //2
int b; //4
long a; //64bitcpu 8;32bitcpu 4
//char c[2]; //2
//short d; //2
//int d;
}*Lnode;
int main()
{
printf("sizeof(struct node) is %d\n",sizeof(struct node));
printf("sizeof(long) is %d,sizeof(int) is %d\n",sizeof(long),sizeof(int));
printf("Lnode is 0x%x,Lnode+3 is 0x%lx\n",Lnode,Lnode+3);
return 0;
}
gcc -g -o test test.c
./test 结果如下
sizeof(struct node) is 16
sizeof(long) is 8,sizeof(int) is 4
Lnode is 0x0,Lnode+3 is 0x30
显然,存放相同数据;2中内存占用小于1。
原因如下:
字节对齐:上述结构体中char a[2]分配8个字节、实际使用2个字节,int b实际使用4个字节、可以在char a[2]分配的8个字节中填充;long a在单独分配8个字节。总共只是16个字节。
二、数据的内存区域——BSS、DATA、STACK、HEAP、TEXT
1.静态存储区域——内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
BSS:存放未初始化全局变量
DATA:存放已初始化全局变量,static声明的局部变量
2.STACK:栈存放局部变量
3.HEAP:堆存放动态分配内存,如malloc分配内存
4.TEXT:代码段,包括常量也存储在这里;一般只读
三、指针与数组
编译器并没有为数组分配一块内存来存其地址,这一点就与指针有很大的差别。