【问题标题】:Passing Arrays as Parameters and Returning Them in C++将数组作为参数传递并在 C++ 中返回它们
【发布时间】:2022-10-12 22:01:05
【问题描述】:
// createArray_1 returns the array as a return value
double* createArray_1( ) {
    return new double [ 10 ];
}

// createArray_2 returns the array from the parameter list
// (using a reference parameter)
void createArray_2( double*& arr ) {
    arr = new double [ 10 ];
}

// createArray_3 returns the array from the parameter list
// (without using a reference parameter but simulating
// pass-by-reference using a pointer)
void createArray_3( double** arr ) {
    *arr = new double [ 10 ];
}

// What is wrong with the following two functions?
// void incorrectCreateArray_1( double* arr ) {
// arr = new double [ 10 ];
//}
// double* incorrectCreateArray_2( ) {
// double arr[ 10 ];
// return arr;
// }

我们有主要功能:

int main() {
   double* D;
   D = createArray_1();
   delete [] D;
   createArray_2( D );
   delete [] D;
   createArray_3( &D );
   delete [] D;
   return 0;
}

你能帮我理解为什么 create_array2 和 create_array3 是正确的,而 wrongCreateArray_1 和 wrongCreateArray_2 是错误的吗?

对我来说,不正确的CreateArray_1 应该没问题,因为我们正在传递一个指针,然后为其分配一个大小为 10 的双精度数组,这似乎是正确的。

另一方面,correctArray_2 返回一个双精度指针,这应该没问题,因为 arr 指向一个双精度数组,这似乎也是正确的。

【问题讨论】:

  • 请使用std::vector一次解决许多问题。自 C++11/14 以来,不鼓励显式使用 newdelete (并且在数组的情况下更长时间 - 因为引入了 std::vector)。
  • 一般来说,数组是一种 C 结构,最好在 C++ 中完全避免。通过std::vector(或者,如果真的需要,std::array)更安全、更直观。
  • 非常感谢您的建议。我会记住这一点。但是,我认为理解这段代码有什么问题可以帮助我更好地理解整个指针。
  • incorrectCreateArray_1 仅更改参数(它是传递的指针的副本)而不是原始指针。 incorrectCreateArray_2 返回一个指向局部变量的指针,该变量在函数返回时被销毁并导致一个悬空指针。
  • 问题是变量的范围和生命周期。 incorrectCreateArray_1 修改本地值,因此结果不会传递到外部。 incorrectArray_2 使用在函数退出时生命周期结束的本地数组,因此返回的指针悬空导致未定义的行为。

标签: c++ arrays pointers delete-operator


【解决方案1】:
void incorrectCreateArray_1( double* arr ) 
{
    arr = new double [ 10 ];
}

是不正确的,因为您收到一个指针(未初始化)并且您将它指向其他地方。但只有该函数本地的arr 指针被更改。调用代码仍然保留其(未初始化的)指针。

double* incorrectCreateArray_2( ) 
{
    double arr[ 10 ];
    return arr;
}

不正确,因为您返回了一个指向本地对象 (arr) 的指针,该指针在函数返回后将无法访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2011-12-30
    • 2010-10-20
    相关资源
    最近更新 更多