C ++多次访问数组元素

时间:2016-04-26 19:33:53

标签: c++ arrays element

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在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

会给你一个错误。

答案 2 :(得分:-2)

问题是数组是在堆栈上创建的,并且返回指向此对象的指针。基本上你要归还dangling pointer

要解决此问题,您需要为阵列分配内存:

#2

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

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

或使用vector:

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