对C程序的存储空间布局的初识

简介: 今天在老师的指引下我考虑了C语言的存储空间布局,才深深的感到了自己是个小白,什么也不懂,或许那句话“程序员为啥会犯错误,不是因为他不懂什么而是因为觉得自己都懂。”

今天在老师的指引下我考虑了C语言的存储空间布局,才深深的感到了自己是个小白,什么也不懂,或许那句话“程序员为啥会犯错误,不是因为他不懂什么而是因为觉得自己都懂。”


正文:

之所以在C中能自如的调用函数那都是因为栈(stack)的存在,在栈中保存着函数调用的场景信息,这句话是书上的,我是这么理解的,这些场景信息也就是包括函数的入口地址,形参,函数的返回值,以及一些寄存器的值。栈是自动分配内存的。


C语言的存储空间从高地址到低地址依次是:

命令行参数和环境变量:

栈:

堆:

非初始化数据段:未初始化的全局变量和静态变量

初始化数据段:已经初始化的全局变量和静态变量

正文段:程序就在这里


此外小知识点我还要捡起来:

printf:输出无符号整形变量 用%u

          输出十六进制  用%x


今天我学到的新名词:栈帧(未完全懂)


1.静态库libstatic.a和动态库dynamic.dll

我的认识:

2.为什么要引入段地址?

inter提出用段地址+偏移地址的方式来寻址,这是为了让CPU能访问更多的内存,如果有偏移地址的话,可用的最大内存只有64KB,也就是说:

段地址存在最初意义是为了隔离。

目录
相关文章
|
编译器 Linux C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(上)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
5月前
crash —— 获取内核地址布局、页大小、以及栈布局
crash —— 获取内核地址布局、页大小、以及栈布局
|
程序员
拷贝函数的优化
拷贝函数的优化
79 0
|
存储 编译器 芯片
IAR编译器如何节省代码占用的flash空间?
IAR编译器如何节省代码占用的flash空间
纹理,这次没用Shader头文件,但是没有报“超出内存”的错误,不知道为什么
纹理,这次没用Shader头文件,但是没有报“超出内存”的错误,不知道为什么
|
C语言 索引
【C 语言】文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )
【C 语言】文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )
447 0
【C 语言】文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )
|
Linux Windows 内存技术
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(二)
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(二)
345 0
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(二)
|
内存技术
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(三)
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(三)
190 0
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(三)
|
前端开发 C语言 芯片
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(一)
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(一)
371 0
【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )(一)
|
存储 Linux 开发工具
Qt编写自定义控件34-磁盘容量统计
一、前言 磁盘容量统计控件,说白了,就是用来统计本地盘符占用的容量,包括但不限于已用空间、剩余空间、总大小、已用百分比等,其中对应的百分比采用进度条显示,该进度条的前景色和背景色及文字颜色可以设置,在整体换肤的时候就需要用到。
872 0