首先给出一个例子:
#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="http://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; }