//栈区: //由编译器自动分配释放,存放函数的参数值、局部变量等 //注意事项 : 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放 #if 0 #include int * func(int b) //形参数据也会放在栈区 { b = 100; int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完之后自动释放 return &a; //返回局部变量的地址 } int main() { //接受func函数的返回值 int* p = func(1); std::cout << *p << std::endl; //第一次可以打印正确的数字是因为编译器做了保留 std::cout << *p << std::endl; //第二次这个数据就不再保留 system("pause"); return 0; } //堆区 //由程序员分配释放,若程序员不是放,程序结束时由操作系统回收 //在C++中主要利用new在堆区开辟内存 #include int* func() { //利用new关键字可以将数据开辟到堆区 //指针 本质也是 局部变量 ,放在栈上 , 指针保存的数据是在堆区 int *p = new int(10); return p; } int main() { //在堆区开辟数据 int *p = func(); std::cout << *p << std::endl; system("pause"); return 0; } #endif // 0 //总结: //堆区数据由程序员开辟和释放 //堆区数据利用new关键字进行开辟内存