开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情。
一、栈区
- 不要返回局部变量的地址,因为局部变量在函数执行之后就释放了,我们没有权限去操作释放后的内存
二、堆区
-
在堆区开辟的数据,记得手动开辟,手动释放
注意事项如果在主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中指针分配内存
三、数据区
-
放入是静态变量、全局变量、常量
-
static 和 extern 区别
- static 静态变量:编译阶段分配内存,只能在当前文件内使用,只初始化一次
- extern 全局变量,C语言下默认的全局变量前都隐藏的加了该关键字
- const修饰的变量
- 全局变量
直接修改 失败
间接修改 失败 原因放在常量区,受到保护
- 局部变量
直接修改 失败
间接修改 成功 原因放在栈上
伪常量 不可以初始化数组
- 字符串常量
-
不同的编译器可能有不同的处理方式
-
ANSI没有制定出标准
-
有些编译器可以修改字符串常量,有些不可以
-
有些编译器将相同的字符串常量看成同一个
四、函数调用流程
- 宏函数
-
在一定程度上会比普通函数效率高,普通函数会有入栈和出栈的时间开销
-
将比较频繁短小的函数 写为宏函数,直接跑源码
-
优点: 以空间换时间
- 调用惯例
-
主调函数和被调函数都必须有一致的约定,才可以正确的调用函数,这个约定我们称为调用惯例
-
调用惯例包含的内容: 出栈方、参数的传入顺序、函数名称的修饰
-
c和c++下默认的调用惯例为
cdecl