我正在学习C ++,当我运行以下代码时,我发现了一个奇怪的结果:
#include <iostream>
using namespace std;
int* arrayTest(){
int arr[3] = {1, 2, 3};
int * poi = arr;
return poi;
}
int main(){
int* arr = arrayTest();
for (int i = 0; i <3; i++){
cout << *(arr+i) << endl;
}
return 0;
}
结果是:
./a.out
1
0
167772160
此代码有什么问题?
g++ --version
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin17.2.0
谢谢。
答案 0 :(得分:2)
此功能的设计存在问题:
int* arrayTest() {
int arr[3] = {1, 2, 3};
int * poi = arr;
return poi;
}
变量arr
是一个局部变量(在官方C语言中,它具有&#34;自动存储持续时间&#34;)。这意味着只要函数返回,就会回收与该数组关联的内存并将其回收以供将来使用。
这里的问题是你已经为数组做了一个指针(poi
)。当你返回那个指针时,它会指向arr
曾经在内存中的位置,除了唉,从函数arr
返回后,已经拖曳了这个凡人线圈并且不再存在。你现在有一个悬空指针,这意味着它指向任何碰巧被放置在arr
曾经存在的内存中的不幸对象。这会导致未定义的行为,这意味着任何事情都可能发生(在您的情况下,程序会打印垃圾值。)