变量三要素是

  • 名称
  • 大小
  • 作用域

那么变量的生命周期是多长呢?

编译器是如何管理每个函数间变量的生命周期呢?

要研究变量的生命周期,而变量一般又是在函数中定义分配空间的。

因此下面研究一下变量作为函数参数和返回值传递分析

下面我们具体总结一下,各个函数的变量的生命周期

函数调用模型 - 图1

main里面的变量分配内存,函数fa(),函数fb()中的变量分配的内存空间它们的生命周期都是多长呢?

上述图1,已经说明了内存主要分为四区,因此每个函数中变量在堆栈的生命周期是不同的,

同时在函数调用的时候,先执行的函数最后才执行完毕

函数调用模型 - 图2

  1. char* fa(){
  2. char* pa = "123456"; //pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
  3. char* p = NULL; //指针变量p在栈中分配4字节
  4. p = (char*)malloc(100);//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给p
  5. strcpy(p, "wudunxiong 1234566");//把常量区的字符串拷贝到堆区
  6. return p;//返回给主调函数fb(),相对fa来说fb是主调函数,相对main来说,fa(),fb()都是被调用函数
  7. }
  8. char* fb(){
  9. char* pstr = NULL;
  10. pstr = fa();
  11. return pstr;//指针变量pstr在这就结束
  12. }
  13. void main(){
  14. char* str = NULL;
  15. str = fb();
  16. printf("str = %s\n",str);
  17. free(str); //防止内存泄露,被调函数fa()分配的内存存的值通过返回值传给主调函数,然后主调函数释放内存
  18. str = NULL;//防止产生野指针
  19. system("pause");
  20. }

函数调用模型 - 图3

如何建立正确的程序运行内存布局图

  • 内存四区模型&函数调用模型
  • 函数内元素
    • 深入理解数据类型和变量“内存”属性
    • 一级指针内存布局图(int ,char)
    • 二级指针内存布局图(int char )
  • 函数间
    • 主调函数分配内存,还是被调用函数分配内存
    • 主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)