C 语言编译过程 C语言中各种数据存储的不同内存区域 关于sizeof 结构体比实际的大的问题
来源:互联网 发布:xcode c语言 编辑:程序博客网 时间:2024/04/28 17:03
一 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
其中 指针类型和内存寻址范围有关;
- C 语言编译过程 C语言中各种数据存储的不同内存区域 关于sizeof 结构体比实际的大的问题
- C语言程序的存储区域和编译过程
- C语言程序中不同的存储区域
- 关于c语言字符串中sizeof指针的问题
- 关于c语言的sizeof
- C语言中结构体的内存对齐问题
- C语言的各种数据在内存中如何存储?
- C语言中关于结构体大小的问题
- C语言程序编译后的存储区域区分
- C语言程序的存储区域和内存布局
- C语言程序的存储区域--内存布局
- 关于C中结构体的大小问题(sizeof)
- c语言中有关void,sizeof,结构体的一些问题
- C语言程序的内存布局(一)C语言程序的存储区域
- 关于linux中c语言的编译问题的总结
- [转]C语言程序的存储区域
- C语言程序的存储区域
- C 语言程序的存储区域
- main函数之后的调用
- 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处
- 中国核电站分布图
- C语言 文件操作函数 网络编程 共用体 union 结构体 定义
- C语言中原码,反码,补码的分析
- C 语言编译过程 C语言中各种数据存储的不同内存区域 关于sizeof 结构体比实际的大的问题
- C/C++数组名与指针区别深入探索
- static 类型的特性
- Qt程序——socket编程
- Qt文件操作
- 改变html的默认.html和.cgi 文件路径
- html 笔记1 (表单提交时汉字为乱码的处理)
- pc机与6410交叉编译
- linux 基本操作