【问题标题】:Cast an array to pointer in function return将数组转换为函数返回中的指针
【发布时间】:2012-05-10 01:10:05
【问题描述】:

我遇到了关于 C++ 中指针的问题。代码是:

int * initArray() {
    int a [2];

    a[0] = 1;
    a[1] = 2;
    return a;
}


int main () {
    int * b = initArray();

    cout << b << "---" << *(b) << endl;
    cout << b + 1<< "---" << *(b + 1) << endl;
}

输出是

0021FC20---1
0021FC24---1431629120

您可以看到该值是错误的。

当我尝试将init 数组代码放入主函数时,它运行正常。

你能说出我的代码有什么问题吗?

【问题讨论】:

标签: c++ function pointers return


【解决方案1】:

initArray 正在返回函数返回后不再存在的本地数组的地址。这是一种未定义的行为。

要使变量 a 即使在函数返回时也保持不变,您可以:

  • 声明为static
  • 全球化
  • 动态分配

【讨论】:

    【解决方案2】:

    实现您想要做的事情的解决方案是:

    int * initArray() {
        int* a = new int[2];
    
        a[0] = 1;
        a[1] = 2;
        return a;
    }
    

    由于内存是手动分配的,所以会持久化,构造应该是有效的。是的,在您的情况下,内存是自动分配的,并在函数结束时删除,导致未定义的行为。

    【讨论】:

      【解决方案3】:

      a 是 initArray 方法的局部变量。一旦方法返回,a就不再有效,所以initArray返回的指针也不再有效。

      您需要在 main 方法中分配数组,然后将指针传递给 initArray 方法:

      void initArray(int *a) {
          a[0] = 1;
          a[1] = 2;
      }
      
      int main () {
          int b[2];
          initArray(b);
      
          cout << b << "---" << *(b) << endl;
          cout << b + 1<< "---" << *(b + 1) << endl;
      }
      

      【讨论】:

      • 如果您将数组的大小传递给initArray,我会觉得这个答案更舒服。在这种情况下,也许尺寸总是固定的,但最好早点鼓励好习惯。
      【解决方案4】:

      您的数组int a[2] 是一个本地数组,它在函数存在时被释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多