第14章 C语言内存精讲总结
你好,欢迎来到「C语言和内存」专题,你将开启一扇全新的大门,看到C语言的本质,彻底明白C语言的运行机理。
当你决定学习「内存」,你已然超越了90%的程序员!
一个C语言程序必须载入内存才能运行(任何程序都是这样),CPU也被设计为只能从内存中读取数据和指令,(个人:我们使用word软件打开一个文档时,文档里面的数据会从硬盘加载到内存,我们在word软件里的操作,是使用CPU操作内存中的数据,内存中数据的操作结果会被显示到word软件里界面里,但是如果我们不保存,此时硬盘上的文档里的数据还是老样子,还是没有改变)一名不了解内存的程序员,注定不能让自己的编程水平有一个质的飞越,只能雾里看花,知其然不知其所以然。
本专题涉及到计算机组成原理、操作系统、汇编语言等多方面的知识,并将它们和具体的C语言代码结合起来,运用到实际编程中。
本专题将为你解开以下谜团:
- C语言中使用的地址为什么是假的,(个人:也就是我们在C语言程序中例如使用prinf打印出的内存的地址)计算机又是如何通过假的地址访问到真实的物理内存的?
- 一个C语言程序在内存中是如何分布的?(个人:也就是一个C语言程序执行时,被加载到内存,这个C语言程序在内存中如何分布,这个C语言程序里的各个内容在这个内存中各自放在哪里)函数放在哪里?变量放在哪里?字符串放在哪里?
- 为什么全局变量在整个程序中都可以使用,而局部变量只能在函数内部使用?
- 一个C语言程序可以使用多大的内存?
- 操作系统和用户程序之间是如何协作的?
- 堆和栈都是什么,它们在程序运行过程中起到什么作用?为什么栈内存的分配效率要高于堆?
- 栈溢出是怎么回事,如何利用栈溢出进行攻击?
- 内存泄漏、野指针、非法内存访问、段错误都是怎么产生的?
- 内存池、线程池、连接池等这些莫名其妙的“池子”是怎么回事?
本专题内容:
- 载入内存,让程序运行起来
- 一个程序在计算机中到底是如何运行的?
- 虚拟内存到底是什么?为什么我们在C语言中看到的地址是假的?
- 虚拟地址空间以及编译模式
- 内存对齐
- 内存分页机制,完成虚拟地址的映射
- 内存分页机制的实现(虚拟地址和物理地址的映射)
- MMU部件以及对内存权限的控制
- Linux下C语言程序的内存布局(内存模型)
- Windows下C语言程序的内存布局
- 用户模式和内核模式
- 栈的概念以及栈溢出
- 一个函数在栈上到底是怎样的
- 函数调用惯例(Calling Convention)
- 详细分析一个函数进栈出栈的例子
- 栈溢出攻击的原理
- C语言动态内存分配
- malloc()背后的实现原理――内存池
- C语言野指针以及非法内存操作
- C语言内存泄露(内存丢失)
- C语言变量的存储类别和生存期