【C++内存分区]

全局区包括全局变量、静态变量、常量(字符串常量和const 修饰的全局变量),以下为代码测试部分,由运行结果可知,全局区存储的存储对象。

#include <iostream>
#include<string.h>
using namespace std;
int g_a = 1;
int g_b = 2;
static int g_c = 3;
const int g_d = 4;
string g_s = "www";

int main()
{
	int a = 1;
	int b = 2;
	
	static int c =3;
	string s = "www";
	const int d = 4;
	
	cout << "局部变量a的地址: " << (long int)&a << endl;
	cout << "局部变量b的地址: " << (long int)&b << endl;
	
	cout << "全局变量g_a的地址: " << (long int)&g_a << endl;
	cout << "全局变量g_b的地址: " << (long int)&g_b << endl;
	
	cout << "全局静态变量g_c的地址: " << (long int)&g_c << endl;
	cout << "局部静态变量c的地址: " << (long int)&c << endl;
	
	cout << "全局字符串变量g_s的地址: " << (long int)&s<< endl;
	cout << "局部字符串变量s的地址: " << (long int)&s<< endl;
	cout << "字符串常量s的地址: " << (long int)&"s"<< endl;
	
	cout << "const 修饰全局变量g_d的地址: " << (long int)&g_d<< endl;
	cout << "const 修饰局部变量g_d的地址: " << (long int)&d<< endl;
	
    return 0;
}

运行结果

局部变量a的地址: 140726742958648
局部变量b的地址: 140726742958644
全局变量g_a的地址: 4210832
全局变量g_b的地址: 4210836
全局静态变量g_c的地址: 4210840
局部静态变量c的地址: 4210844
全局字符串变量g_s的地址: 140726742958608
局部字符串变量s的地址: 140726742958608
字符串常量s的地址: 4202818
const 修饰全局变量g_d的地址: 4202508
const 修饰局部变量g_d的地址: 140726742958604

栈区

存储在栈区的局部变量的地址不可以返回,因为栈区开辟的数据在函数执行完之后,编译器已经释放了,强行返回的结果如下,出现莫名的数值

#include <iostream>
using namespace std;

int * func(){
	int a = 1;
	int *a1 = &a;
	cout<<"栈区局部变量a的地址是"<<&a<<"; a的值是"<<a<<endl;
	return a1;
}

void test(){
	int * a2 = func();
	for(int i=1; i<11; i++){
	cout<<"第 "<<i<<" 次输出"<<"栈区局部变量a的地址 "<<a2<<"; a的值 "<<*a2<<endl;
	}
}


int main()
{
    text();
    return 0;
}

第一次运行结果

栈区局部变量a的地址是0x7ffda13df524; a的值是11 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327652 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327653 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327654 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327655 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327656 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327657 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327658 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 327659 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 3276510 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765

第二次运行结果

栈区局部变量a的地址是0x7fff65893ea4; a的值是11 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327672 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327673 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327674 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327675 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327676 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327677 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327678 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 327679 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 3276710 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767

堆区

堆区的内存由程序员自己分配并释放,程序运行结束时操作系统同样会释放回收,由运行结果可知,通过new方式传递,不会出现异常

#include <iostream>
using namespace std;

int * func(){
	
	int* a = new int(1);
	cout<<"堆区局部变量a的地址是"<< a <<"; a的值是"<<*a<<endl;
	return a;
}

void test(){
	int * a2 = func();
	for(int i=1; i<11; i++){
	cout<<"第 "<<i<<" 次输出"<<"栈区局部变量a的地址 "<< a2 <<"; a的值 "<< *a2 <<endl;
	}
}

int main()
{
	test();
    return 0;
}

运行结果

堆区局部变量a的地址是0x15dfe70; a的值是11 次输出栈区局部变量a的地址 0x15dfe70; a的值 12 次输出栈区局部变量a的地址 0x15dfe70; a的值 13 次输出栈区局部变量a的地址 0x15dfe70; a的值 14 次输出栈区局部变量a的地址 0x15dfe70; a的值 15 次输出栈区局部变量a的地址 0x15dfe70; a的值 16 次输出栈区局部变量a的地址 0x15dfe70; a的值 17 次输出栈区局部变量a的地址 0x15dfe70; a的值 18 次输出栈区局部变量a的地址 0x15dfe70; a的值 19 次输出栈区局部变量a的地址 0x15dfe70; a的值 110 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N1CROWN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值