我是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" */
答案 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::vector或std::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 };
}