多次C++处理数组元素



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

我已经在一个函数中创建了一个双精度数组,返回了一个指针,现在正在尝试访问数组的枚举。我可以像你一样访问任何元素,arr[i],但是当我尝试访问第二个元素(是的"一个"秒,而不是"那个"秒)时,一切都非常错误。有时我得到零,其余时间我得到非常大的数字(接近最大的双精度,不是无穷大,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" */

不允许返回指向堆栈分配变量(或数组)的指针,因为这会导致未定义的行为。您应该通过以下方式在堆中分配数组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;
}

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

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

会给你一个错误。

问题是数组是在堆栈上创建的,并且返回指向此对象的指针。基本上你返回的是一个悬空的指针。

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

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

请记住,您需要释放内存。更好的方法是对固定大小的数组使用 std::vector 或 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 };
}

最新更新