一 C 语言编译过程
第一步 预处理 将.c文件处理成.i文件
第二步 编译(调用C编译器) 将.i 编译成汇编的.s文件
第三步 汇编(调用汇编器) 将.s编译成可重定向的.o文件
第四步 链接 (调用连接器) 将main.o hello.o以及必要的系统目标文件链接组合,生成一个可执行的目标文件.out;(假设源文件中有main.c hello.c main.h 等)
二 C语言中各种数据存储的不同内存区域
————————————————————————
栈 (参数,局部变量)
______________________________________
共享库
——————————————-————————
堆 (malloc() free() realloc() 动态分配的内存)
————————————————————————
data (全局变量 ,static修饰的局部变量 初始化了变量)
——————————
bss段 (全局变量 未初始化)
——————————————————————————
rodata ( 字符串常量 如 char *a = "hello"; )
————————————————————————————
text 段 (存储程序指令)
————————————————————————————
三 关于sizeof 结构体比实际的大的问题
举个例子
struct T
{
char ch;
double d;
}
struct T k;
sizeof(k) 的值是多少? 一般认为 在32位机中,char 展1字节double占 8字节,则值应该是9字节,GCC编译之后,答案是12
原来实际的计算机系统存储时有“内存对齐”的要求,即存储的首地址有要求,GCC 最大对齐是4,即上边的char由于和double在一起被提成4;
各种类型所占内存大小
32位 64位
char 1 1
int 4 4
long 4 8
long long 8 8
char * 4 8
float 4 4
double 8 8
其中 指针类型和内存寻址范围有关;