函数与栈

首先来看个程序:

#include <iostream.h>
char* GetCh1(void);
char* GetCh2(void);
int main()
{
 char* temp = NULL;
    temp = GetCh1();//如果这里调用GetCh1则打印出‘a’,调用GetCh2则打印不出'a';
 int* c = new int(5);//重新分配内存操作
 cout<<(*temp);
 cout<<endl;
 return 0;
}

 

//第一种情况

char*GetCh1(void)
{
 char* pCh ;
 pCh = "a";
 return pCh;
}

 

//第二种情况

char*GetCh2(void)
{
 char*pCh;
 char chArray = 'a';
 pCh = &chArray;
 return pCh;
}

 

 

由上面的注释可以看出GetCh2函数这种返回值为指针的情况是错误的,要知道这个错误我们就必须知道函数和栈的关系:

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

 

函数返回值,返回的是函数局部变量的拷贝,即使返回值为指针,它返回的仍然是局部变量的指针的拷贝,不会因为局部变量释放而出错!

由此可知上面两个函数的返回值指针GetCh1指向的是堆内存,GetCh2指向的是栈内存,所以函数调用后,栈内存释放,而堆内存仍然在,所以主函数去打印返回值指针指向的内存空间会出现不同的情况!

 

注:如果主函数中没有int* c = new int(5);//重新分配内存操作,你会发现调用两个函数都能打印出‘a’

 

你可能感兴趣的:(函数与栈)