C++ 多次访问数组元素

C++ Acessing Array Elements Several Times

我是 C++ 的新手,但几年来一直使用不太硬核的语言(java、python)进行编程。我刚刚在我的代码中遇到了一个非常奇怪的错误,正在寻找解释和解决方案。

我在一个函数中创建了一个双精度数组,返回了一个指针,现在正在尝试访问该数组的元素。 arr[i],我可以像您一样访问任何元素,但是当我尝试访问第二个元素(是 "a" 秒,而不是 "the" 秒)时,一切都变得非常错误。有时我得到零,其余时间我得到非常大的数字(接近不是无穷大的最大双倍数,1.7...10^308)。´

据我所知,访问数组中实际上不在数组中的位置应该会呈现此类结果,但即使 运行 cout<<arr[1]<<", "<<arr[0]; 也会先打印出预期的结果,然后再打印一些非常不合理的结果。

我真的很想正确理解发生了什么,所以感谢任何帮助,但请记住我是 C++ 的新手,谢谢。

-----编辑-----

我的问题是这样的:

double* fun(){
    double arr[] = {3.14, 2.7, 1.0};
    return arr;
}

int main(){
    double* arr = fun();
    cout<<arr[1]<<", "<<arr[0]<<endl;

    return 0;
}

/* Prints "2.7, 0" */

在 C++ 中,从技术上讲,您可以访问数组中未分配的元素。其他语言,例如 Java 实际上会阻止您这样做。如果它给您返回垃圾值,则您正在访问未分配的 space。确保检查你的边界。例如:

double array[10];
cout << array[100]; // gives back junk value because it was not allocated. You need to stay within the index values 0 - 9.

有效...但是

double array[10];
cin >> array[100];  // Cause an error. Seg fault most likely

会给你返回一个错误。

您不能 return 指向堆栈分配变量(或数组)的指针,因为它会导致未定义的行为。您应该通过 new:

在堆上分配数组
double *fun(){
    double *arr = new double[3];
    arr[0] = 1;
    arr[1] = - 123.45;
    arr[2] = 42;

    return arr;
}

或者你可以使用静态数组的标准容器,这样更好也更方便:

#include <array>

std::array<double, 3> fun(){
    std::array<double, 3> result = {3.14, 2.7, 1.0};
    return result;
}

问题是数组是在堆栈上创建的,并且返回了指向该对象的指针。基本上你返回一个 dangling pointer.

要解决这个问题,您需要为数组分配内存:

double* fun() {
    auto arr = new double[3]{ 3.14, 2.7, 1.0 };
    return arr;
}

请记住,您需要释放内存。更好的方法是将 std::vector or std::array 用于固定大小的数组。这些对象的堆内存将由对象的生命周期 (RAII) 安全地管理。

std::array<double,3> fun() {
    return { 3.14, 2.7, 1.0 };
}

或使用矢量:

std::vector<double> fun() {
    return { 3.14, 2.7, 1.0 };
}