C ++返回数组并显示它

时间:2014-10-23 23:49:17

标签: c++ arrays

我想问一下,为什么这段代码不起作用......

int* funkce(){
    int array[] = {1,2,3,4,5};
    return(array);
  }

int main(){

    int* pp = funkce();
    int* ppk = pp+5;

    for (int *i = pp; i!=ppk; i++){
        cout << (*i) << endl;
    }

    system("PAUSE");
    return(0);
}

此代码显示:

1
16989655
4651388
- // -
253936048

所以poniter不在阵列中...... 但是怎么可能,这个带有Main数组的代码可以吗?

int main(){

    int a[] = {1,2,3,4,5};
    int* pp = a;
    int* ppk = pp+5;

    for (int *i = pp; i!=ppk; i++){
        cout << (*i) << endl;
    }
    system("PAUSE");
    return(0);
}

此代码显示:

1
2
3
4
5

你能解释一下,为什么第一个不起作用? 谢谢!

2 个答案:

答案 0 :(得分:6)

当函数结束时,您将返回指向超出范围的临时指针。如果你想让一个函数返回一个数组,你需要做一个:

std::array<int, 5> func() {
    // stack-allocated
    std::array<int, 5> a = {1, 2, 3, 4, 5};
    return a;
}

std::vector<int> func() {
    // heap-allocated
    std::vector<int> a = {1, 2, 3, 4, 5};
    return a;
}

int* func() {
    // heap-allocated, you have to remember to delete it
    int* a = new int[5]{1, 2, 3, 4, 5};
    return a;
}

等。还有更多选择,但这应该会给你一个良好的开端。

答案 1 :(得分:0)

永远不要返回本地指针/引用变量,该内存在返回时被释放/重用。

使用悬挂引用是未定义的行为并且具有不可预测的后果。

返回一个对象,一个指向堆分配内存的指针,或保存到调用者提供的缓冲区中。