c语言之栈存储区和全局区理解

首先给出一个例子:

#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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值