1.不要返回局部变量的地址
1 int* func() 2 { 3 int a = 10; 4 return &a; 5 } 6 int main() 7 { 8 int* p=func(); 9 cout << *p << endl; 10 cout << *p << endl; 11 return 0; 12 }
输出结果:
第一次输出还是10是因为a原来在的内存还没有被覆盖,所以可以输出。函数调用返回后栈上的数据并没有被清空只而是程序失去了对栈所在内存的控制权。第二次输出的时候已经被别的数据覆盖了,所以输出的内容是不可控的。注意x86才会出现这种情况。
2.可以返回堆区变量的地址
1 int* func() 2 { 3 int *p = new int(10); 4 return p; 5 } 6 int main() 7 { 8 int* p1=func(); 9 cout << *p1 << endl; 10 cout << *p1 << endl;//堆区的数据由程序员管理开辟,程序员管理释放 11 return 0; 12 }
输出结果: