C++基础学到栈区这

int * func()
{
    int a = 10;
    return &a;
}
int main() 
{

    int *p = func();

    cout << *p << endl;
    cout << *p << endl;

    system("pause");

    return 0;
}

运行后
10
2049153416
一个输出数值一个输出地址,谁能告诉我为啥

img

堆区存放的变量(用new,malloc,calloc,realloc等分配内存函数得到的变量)由程序员分配释放。
栈区存放的变量(局部变量、函数参数等)由编译器自动分配释放
int a是一个局部变量,在fun函数结束后,编译器就自动释放了,所以哪怕返回了指向这个变量的指针,但是这个变量所在的内存可能被系统分配给其他的程序使用了。所以*p得到的结果就是一个不确定的值了。

总之记住的一句话:变量的生命期要判断清楚,一旦超出生命期,系统就会回收变量占用的空间。这块空间随时会被系统分配给其它进程或本进程的其它变量,原变量已失去控制权,所以出现啥样的值都有可能。