变量三要素是
- 名称
- 大小
- 作用域
那么变量的生命周期是多长呢?
编译器是如何管理每个函数间变量的生命周期呢?
要研究变量的生命周期,而变量一般又是在函数中定义分配空间的。
因此下面研究一下变量作为函数参数和返回值传递分析
下面我们具体总结一下,各个函数的变量的生命周期
main里面的变量分配内存,函数fa(),函数fb()中的变量分配的内存空间它们的生命周期都是多长呢?
上述图1,已经说明了内存主要分为四区,因此每个函数中变量在堆栈的生命周期是不同的,
同时在函数调用的时候,先执行的函数最后才执行完毕
char* fa(){
char* pa = "123456"; //pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
char* p = NULL; //指针变量p在栈中分配4字节
p = (char*)malloc(100);//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给p
strcpy(p, "wudunxiong 1234566");//把常量区的字符串拷贝到堆区
return p;//返回给主调函数fb(),相对fa来说fb是主调函数,相对main来说,fa(),fb()都是被调用函数
}
char* fb(){
char* pstr = NULL;
pstr = fa();
return pstr;//指针变量pstr在这就结束
}
void main(){
char* str = NULL;
str = fb();
printf("str = %s\n",str);
free(str); //防止内存泄露,被调函数fa()分配的内存存的值通过返回值传给主调函数,然后主调函数释放内存
str = NULL;//防止产生野指针
system("pause");
}
如何建立正确的程序运行内存布局图
- 内存四区模型&函数调用模型
- 函数内元素
- 深入理解数据类型和变量“内存”属性
- 一级指针内存布局图(int ,char)
- 二级指针内存布局图(int char )
- 函数间
- 主调函数分配内存,还是被调用函数分配内存
- 主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)