C ++ cout数组中的数字错误

时间:2017-11-16 19:53:14

标签: c++

我正在学习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

谢谢。

1 个答案:

答案 0 :(得分:2)

此功能的设计存在问题:

int* arrayTest() {
  int arr[3] = {1, 2, 3};
  int * poi = arr;
  return poi;
}

变量arr是一个局部变量(在官方C语言中,它具有&#34;自动存储持续时间&#34;)。这意味着只要函数返回,就会回收与该数组关联的内存并将其回收以供将来使用。

这里的问题是你已经为数组做了一个指针(poi)。当你返回那个指针时,它会指向arr曾经在内存中的位置,除了唉,从函数arr返回后,已经拖曳了这个凡人线圈并且不再存在。你现在有一个悬空指针,这意味着它指向任何碰巧被放置在arr曾经存在的内存中的不幸对象。这会导致未定义的行为,这意味着任何事情都可能发生(在您的情况下,程序会打印垃圾值。)