c语言栈区怎么存储,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;

}打印的结果如下:

0818b9ca8b590ca3270a3433284dd417.png

如果把方法getStr2()中的

char* p2 = "abcde2";改为

char* p2 = "abcde1";

输出的结果如下:

这里打印出的地址是一样的;具体原因如下:

// 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、付费专栏及课程。

余额充值