在函数返回中将数组转换为指针

时间:2012-04-30 10:11:47

标签: c++ function pointers return

我在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数组代码放入main函数时,它会正确运行。

你能告诉我的代码有什么问题吗?

4 个答案:

答案 0 :(得分:8)

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

要使变量a持久,即使函数返回,您也可以:

  • 将其声明为static
  • 让它全球化
  • 动态分配

答案 1 :(得分:3)

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

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

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

由于内存是手动分配的,因此它将保持不变并且构造应该有效。是的,在您的情况下,内存是自动分配的,并在函数末尾删除,导致未定义的行为。

答案 2 :(得分:1)

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;
}

答案 3 :(得分:0)

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