免费金融发布网站模板,代理公司注册收费,上海对外贸易公司,彩票系统网站建设#xff11;昨天有一个群里的同学问我#xff0c;他问我的问题是 c 语言函数是存在哪里的#xff1f;是如何执行的#xff1f;我下意识的觉得这位同学应该是个初学者#xff0c;所以今天就写下一些基础方面的内容#xff0c;「C语言的内存布局」。程序代码可以看做是一个… 昨天有一个群里的同学问我他问我的问题是 c 语言函数是存在哪里的是如何执行的我下意识的觉得这位同学应该是个初学者所以今天就写下一些基础方面的内容「C语言的内存布局」。程序代码可以看做是一个人是人就需要有房子住操作系统就是政府政府有义务给找个位置给你住如果你是高级人才他就给你个 vip 给你分个大房子但是如果你对社会没有帮助 手上没钱那你可能就需要住天桥下。我们刚开始学习单片机的时候还没有进程线程操作系统的概念程序直接下载到 rom 里面等你有了操作系统概念反过来看看会觉得以前自己写的代码都是单线程的。2C 语言内存分配的框图如下一个正常的执行代码 操作系统需要给他分配一段内存区域这一大块内存区域还要分为几个小区域。1.文本段Text segment2.初始化数据段Initialized data segment3.未初始化数据段Uninitialized data segment4.堆栈Stack5.堆 Heap31.文本段文本段也称为代码段是目标文件或内存中包含可执行指令的程序的一部分。作为存储区域文本段可以放置在堆或堆栈下方以防止堆和堆栈溢出覆盖它。通常文本段是可共享的因此对于频繁执行的程序例如文本编辑器C 编译器shell 等只需要一个副本就可以在内存中。此外文本段通常是只读的以防止程序意外修改其指令。文本段可以看做 这段代码 的 大脑需要怎么执行做什么都把数据保存在这个位置了。2.初始化数据段初始化数据段通常简称为数据段。数据段是程序的虚拟地址空间的一部分其包含由程序员初始化的全局变量和静态变量。请注意数据段不是只读的因为变量的值可以在运行时更改。该段可以进一步分类为初始化的只读区域和初始化的读写区域。例如C 中的 char s [] “hello world”定义的全局字符串和 int debug 1 之类的 C语句 将存储在初始化的读写区域中。像 const char * string “hello world”这样的全局 C语句 会把 字符串文字“hello world”存储在初始化的只读区域中而字符指针变量字符串存储在初始化的读写区域中。例如static int i 10 将存储在数据段中global int i 10 也将存储在数据段中3.未初始化的数据段未初始化的数据段通常称为“bss”段以古代汇编运算符命名代表“由符号启动的块”。此段中的数据在程序启动之前由内核初始化为算术 0 执行未初始化的数据从数据段的末尾开始包含初始化为零或在源代码中没有显式初始化的所有全局变量和静态变量。例如变量声明为static int i; 将包含在BSS部分中。例如一个声明为int j的全局变量; 将包含在BSS部分中。4.堆栈我们很多时候说的堆栈实际上就是栈 stack 跟堆 heap 是没有关系的。我们学习上经常说的 压栈说的就是压堆栈因为堆栈有 「先进后出的原则」所以我们操作的是栈尾。堆栈区域传统上与堆区域相邻并向相反方向增长; 当堆栈指针遇到堆指针时可用内存耗尽因为理论上这个两个家伙是不可能 相遇的 。使用现代大地址空间和虚拟内存技术它们几乎可以放置在任何地方但它们通常仍会朝着相反的方向发展。堆栈区域包含程序堆栈LIFO结构通常位于存储器的较高部分。在标准的PC x86计算机体系结构上它向零地址发展; 在其他一些架构上它朝着相反的方向发展。“堆栈指针”寄存器跟踪堆栈的顶部; 每次将值“推”到堆栈上时都会调整它。5.堆堆是通常发生动态内存分配的段。堆区域从BSS 段的末尾开始并从那里增长到更大的地址。堆区域由 mallocrealloc 和 free 管理可以使用 brk 和 sbrk 系统调用来调整其大小;它们也可以使用mmap实现将不连续的虚拟内存区域保留到进程的“虚拟地址空间”中。堆区域由进程中的所有共享库和动态加载的模块共享。4实用 size 命令可以分析生成的可执行程序每个段的大小单位是bytes 字节。我们可以用这个命令验证上面的论证。代码实例#includestdio.hint main(){ return 0;}Linuxdev:~/cStudy$ gcc memory-test.c -o memory-test size memory-test text data bss dec hex filename 1099 544 8 1651 673 memory-testLinuxdev:~/cStudy$ 现在代码里面什么都没有可以看到每个段内容的大小。#includestdio.hint g;int main(){ static int i; return 0;}--------------------------------------------------Linuxdev:~/cStudy$ gcc memory-test.c -o memory-test size memory-test text data bss dec hex filename 1099 544 16 1659 67b memory-testLinuxdev:~/cStudy$ 我们声明了一个未初始化的全局变量和一个未初始化的静态变量后bss 段发生了变化。再修改一下#includestdio.hint g 99;int main(){ static int i 100; return 0;}--------------------------------------------------Linuxdev:~/cStudy$ gcc memory-test.c -o memory-test size memory-test text data bss dec hex filename 1099 552 8 1659 67b memory-testLinuxdev:~/cStudy$ 初始化后 bss 段变成原来 8 了 data 段多了 8 个字节。再修改一下#includestdio.hint g ;int main(){ static int i 100; return 0;}--------------------------------------------------Linuxdev:~/cStudy$ gcc memory-test.c -o memory-test size memory-test text data bss dec hex filename 1099 548 12 1659 67b memory-testLinuxdev:~/cStudy$ 这样 bss 段和 data 段都比初始值增加了 4 个字节。5推荐之前跟这个相关的文章也是写 内存 区域的东西两篇文章联系起来看会非常好。堆和栈的区别转过无数次的文章还是推荐一下我的知识星球加入星球的福利我会慢慢增加当然还是以自愿为主加入星球了同学希望还是在星球提问题这样的问答环境会更好也方便追溯问题。我的知识小密圈昨天大概看了一下文章的情况发现收藏的人数很多但是转发的人数很少各位大哥哥大帅哥能不能给小弟一点点活路稍微转发一下在知乎的时候就是收藏的数量远远超过点赞已经让我很伤心了。完各位共勉~