函数调用模型
一 函数调用模型
①入栈的过程
程序开始运行时,操作系统会找到程序的入口函数main。操作系统会把main函数的返回地址入栈,然后把main函数的参数入栈,如果main中有局部变量,还会把这些变量入栈。
main函数中调用fa函数时,操作系统把main函数的运行状态入栈,把fa的返回地址入栈,把fa的参数入栈。
fa函数调用fb函数时,操作系统把fa函数的运行状态入栈,把fb函数的返回地址入栈,把fb的参数入栈。
入栈的过程如图:
②出栈的过程:
fb函数执行完成后,根据fa函数的运行状态,返回fa继续执行。
fa函数执行完成后,根据main函数的运行状态,返回main继续执行。
如图:
二 函数变量的使用范围
1 fa分配的内存可以被函数fb使用吗?
fa可以在栈区申请内存(局部变量), 可以在堆区申请内存(malloc), 可以在数据区申请内存(全局变量,字符串常量等)。 这些区的内存fb都可以使用吗?
fb可以使用fa申请的这些内存。因为函数fb执行时,fa函数还没有return。所以所以内存空间都没有被析构。
2 fb分配的内存可以被函数fa使用吗?
①fb在栈上分配的内存,不能被fa使用。 因为fb函数return以后,栈上的内存就被析构了。int a=0; char * p = NULL;
②fb函数malloc的内存,可以被fa函数使用。因为malloc的内存放在堆中,fb执行结束后,内存没有被析构。malloc(sizeof(char)*10); //申请10字节内存
③fb函数中数据区内存,可以被fa函数使用。因为数据区内存,fb执行结束后,内存没有被析构,虽然fb中不会有全局变量,但是可以有字符串常量 char *pstr1 = "adfag";
PS: 可见,主调函数要想使用被调用函数分配的内存,需要用指针做函数参数或返回值,内存必须是堆区内存或数据区内存,栈区内存会被析构。
三 C++编译器为每个应用程序建立几个内存四区?
一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区?一个堆区,一个栈区,即为每一个应用建立一个内存四区。