C语言重难点归纳(2)

150 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情

一、栈区

  • 不要返回局部变量的地址,因为局部变量在函数执行之后就释放了,我们没有权限去操作释放后的内存

二、堆区

  • 在堆区开辟的数据,记得手动开辟,手动释放

    注意事项 如果在主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中指针分配内存

三、数据区

  1. 放入是静态变量、全局变量、常量

  2. static 和 extern 区别

- static 静态变量:编译阶段分配内存,只能在当前文件内使用,只初始化一次

- extern 全局变量,C语言下默认的全局变量前都隐藏的加了该关键字
  1. const修饰的变量
  • 全局变量
直接修改 失败

间接修改 失败  原因放在常量区,受到保护
  • 局部变量
直接修改 失败

间接修改 成功  原因放在栈上

伪常量 不可以初始化数组
  1. 字符串常量
  • 不同的编译器可能有不同的处理方式

  • ANSI没有制定出标准

  • 有些编译器可以修改字符串常量,有些不可以

  • 有些编译器将相同的字符串常量看成同一个

四、函数调用流程

  1. 宏函数
  • 在一定程度上会比普通函数效率高,普通函数会有入栈和出栈的时间开销

  • 将比较频繁短小的函数 写为宏函数,直接跑源码

  • 优点: 以空间换时间

  1. 调用惯例
  • 主调函数和被调函数都必须有一致的约定,才可以正确的调用函数,这个约定我们称为调用惯例

  • 调用惯例包含的内容: 出栈方、参数的传入顺序、函数名称的修饰

  • c和c++下默认的调用惯例为 cdecl