- 内存分区
- 运行前
- 代码区
- 共享的
- 只读的
- 数据区
- data 已初始化的全局变量、静态变量、常量
- bss 未初始化的全局变量、静态变量、常量
- 代码区
- 运行后
- 栈区
- 属于先进后出的数据结构
- 由编译器管理数据开辟和释放
- 变量的生命周期在该函数结束后自动释放掉
- 堆区
- 容量远远大于栈
- 没有先进后出这样的数据结构
- 由程序员管理开辟和管理释放
- malloc、free
- 记住手动开辟的要手动释放
- 栈区
- 运行前
- 栈区
- 不要返回局部变量的地址,因为局部变量在函数执行之后就释放了,我们没有权限取操作释放后的内存
- 堆区
- 在堆区开辟的数据,记得手动开辟,手动释放
- 注意事项
- 如果在主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中指针分配内存ps:采用二级指针的方式&p=**p,传入给被调函数使用,在被调函数中使用**p返回的是*p的地址。
- 数据区
- 放入是静态变量、全局变量、常量
- static 和 extern 区别
- static 静态变量:编译阶段分配内存,只能在当前文件内使用,只初始化一次
- extern 全局变量,C语言下默认的全局变量前都隐藏的加了该关键字。可以通过这个应用外部的变量。
ps:ectern属于外部链接,当链接发生错误发出“无法解析外部命令”的错误
- const修饰的变量
- 全局变量
- 直接修改 失败
- 间接修改 失败 原因放在常量区,受到保护
- 局部变量
- 直接修改 失败
- 间接修改 成功 原因放在栈上
- 伪常量 不可以初始化数组
- 全局变量
- 字符串常量
- 不同的编译器可能有不同的处理方式
- ANSI没有指定出标准
- 有些编译器可以修改字符串常量,有些不可以
- 有些编译器将相同的字符串常量看成同一个