0

我遇到了关于 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数组代码放入主函数时,它运行正常。

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

4

4 回答 4

8

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

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

  • 将其声明为static
  • 使其全球化
  • 动态分配
于 2012-04-30T10:14:42.147 回答
3

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

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

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

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

于 2012-04-30T10:19:08.247 回答
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;
}
于 2012-04-30T10:16:09.730 回答
0

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

于 2012-04-30T10:14:57.390 回答