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 };
}
我是 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 };
}