全局区包括全局变量、静态变量、常量(字符串常量和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的值是1
第 1 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 2 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 3 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 4 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 5 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 6 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 7 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 8 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 9 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第 10 次输出栈区局部变量a的地址 0x7ffda13df524; a的值 32765
第二次运行结果
栈区局部变量a的地址是0x7fff65893ea4; a的值是1
第 1 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 2 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 3 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 4 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 5 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 6 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 7 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 8 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 9 次输出栈区局部变量a的地址 0x7fff65893ea4; a的值 32767
第 10 次输出栈区局部变量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的值是1
第 1 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 2 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 3 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 4 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 5 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 6 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 7 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 8 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 9 次输出栈区局部变量a的地址 0x15dfe70; a的值 1
第 10 次输出栈区局部变量a的地址 0x15dfe70; a的值 1