首先给出一个例子:
#include "stdafx.h"
#include "stdlib.h"
char* getStr1(){
char* p1 = "abcde1";
return p1;
}
char* getStr2(){
char* p2 = "abcde2";
return p2;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* p1 = NULL;
char* p2 = NULL;
p1 = getStr1();
p2 = getStr2();
printf("p1:%s, p2:%s\n", p1, p2);
printf("p1:%d, p2:%d\n", p1, p2);
system("pause");
return 0;
}
打印的结果如下:
如果把方法getStr2()中的
char* p2 = "abcde2";
改为
char* p2 = "abcde1";
输出的结果如下:
<img src="https://img-blog.csdn.net/20151024163633059?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
这里打印出的地址是一样的;具体原因如下:
// C++.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdlib.h"
char* getStr1(){
/*
"abcde1":是存储在全局区,会在全局区有一个内存地址,也就是有一个存储空间
char* p1:p1由于是局部变量,所以是在栈区,内存会给p1分配一个存储空间,存储空间里面存的是常量:"abcde1"的内存地址
return p1:由于p1存储的是"abcde1"内存地址,所以返回的是常量的内存地址
在这里,因为p1是局部变量,属于栈区的,所以当return之后,该变量就会被析构掉,释放当前的栈存储空间;
*/
char* p1 = "abcde1";
return p1;
}
char* getStr2(){
/*
"abcde1":在这里同样是常量,存储在全局变量存储区中,操作系统不会在给它分配内存,而是引用已经存在的内存地址;
char* p2:p2由于是局部变量,所以是在栈区,内存会给p2分配一个存储空间,存储空间里面存的是常量:"abcde1"的内存地址
return p2:由于p2存储的是"abcde1"内存地址,所以返回的是常量的内存地址
在这里,因为p2是局部变量,属于栈区的,所以当return之后,该变量就会被析构掉,释放当前的栈存储空间;
*/
char* p2 = "abcde1";
return p2;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* p1 = NULL;
char* p2 = NULL;
/*
这里调用getStr1(),调用结束之后,会析构栈中的变量,并出栈,当前的位置被释放,腾出空间
再次调用getStr2(),由于p1在栈里面的位置已经腾出来,所以p2的位置就是之前p1的位置,所以他们两的内存地址是一样的
*/
p1 = getStr1();
p2 = getStr2();
//打印存储的数据
printf("p1:%s, p2:%s\n", p1, p2);
//打印本事存储的地址
printf("p1:%d, p2:%d\n", p1, p2);
//打印变量本事在栈中的内存地址(这打印的值会是一样的)
printf("p1:%s, p2:%s\n", &p1, &p2);
system("pause");
return 0;
}