首页 > 代码库 > 程序在运行过程中变量的保存位置与生命周期

程序在运行过程中变量的保存位置与生命周期

本例说明了一个程序在运行的时候,各种变量所保存的位置。因为位置不同,自然,变量的生命周期也各不相同。

代码示例:

 

#include <iostream>

using namespace std;

int nGNum1;

void showStackAddress()
{
    cout<<"address of showStackAddress() is:\t["<<(void*)&showStackAddress<<"]"<<endl;
    int nStackNum1 = 10;
    static int snNum2 = 10;

    //显示函数中的临时变量的地址,应该位于程序的栈里
    cout<<"the address of nStackNum1 is: \t["<<&nStackNum1<<"]. value is:\t["<<nStackNum1<<"]"<<endl;

    //显示函数内部的静态变量,该地址应该与全局变量在一起。整数型的静态变量被初始化为0
    cout<<"the address of snNum2 is: \t["<<&snNum2<<"]. value is:\t["<<snNum2<<"]"<<endl;
}

int main(int argc, char ** argv)
{
    //显示程序的代码段的地址
    cout<<"process ["<<argv[0]<<"] start @["<<(void*)&main<<"]"<<endl;

    char * pcToArgv0 = argv[0];
    int nNum1 = 10;
    int *pnNum1 = new int (10);
    static int snNum1;

    //显示函数中的临时变量的地址,应该位于程序的栈里
    cout<<"the address of nNum1 is: \t["<<&nNum1<<"]. value is:\t["<<nNum1<<"]"<<endl;

    //显示全局变量的地址。整数型的全局变量被初始化为0
    cout<<"the address of nGNum1 is: \t["<<&nGNum1<<"]. value is:\t["<<nGNum1<<"]"<<endl;

    //显示函数内部的静态变量,该地址应该与全局变量在一起。整数型的静态变量被初始化为0
    cout<<"the address of snNum1 is: \t["<<&snNum1<<"]. value is:\t["<<snNum1<<"]"<<endl;

    //显示程序中的一些数据的地址。
    cout<<"the address of argv[0] is: \tpcToArgv0 @ ["<<&pcToArgv0<<"] to ["<<(void*)pcToArgv0<<"]. value is:\t["<<pcToArgv0<<"]"<<endl;

    //显示函数中用new手工生成的变量的地址,应该位于程序的堆里
    cout<<"the address of heap is: \tpnNum1 @ ["<<&pnNum1<<"] to ["<<pnNum1<<"]. value is:\t["<<*pnNum1<<"]"<<endl;

    showStackAddress();

    delete pnNum1;

    return 0;
}

编译:
用eclipse 自己编译的,实际上使用这个命令:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o cpptest_main.o ..\cpptest_main.cpp
g++ -o cpptest.exe cpptest_main.o

以下是程序的处理结果:
process [D:\projects\eclipse\cpptest\Debug\cpptest.exe] start @[0x4017e1]
the address of nNum1 is:     [0x22fec8]. value is:    [10]
the address of nGNum1 is:     [0x407020]. value is:    [0]
the address of snNum1 is:     [0x407028]. value is:    [0]
the address of argv[0] is:     pcToArgv0 @ [0x22fecc] to [0x341f28]. value is:    [D:\projects\eclipse\cpptest\Debug\cpptest.exe]
the address of heap is:     pnNum1 @ [0x22fec4] to [0x341f60]. value is:    [10]
address of showStackAddress() is:    [0x4016b0]
the address of nStackNum1 is:     [0x22fe9c]. value is:    [10]
the address of snNum2 is:     [0x404000]. value is:    [10]

程序说明:
一个程序在运行过程中,代码保存在代码段,临时变量保存在栈里,用new等手工生产的数据保存在堆里,一些没有名字的变量,也保存在堆里,例如argv[0],程序的全局变量和静态(局部)变量保存全局数据区。
全局变量和静态局部变量在定义的时候如果没有初始化,系统会为其进行初始化,例如,整型会被设定成数字0。

程序在运行过程中变量的保存位置与生命周期