函数声明中我的数组的问题

时间:2016-10-13 22:39:46

标签: c++ arrays

我一直在搜索过去关于这个主题的讨论,我理解数组需要有一个常量值,但是我通过一个变量给它一个常量值,但是它没有用。我需要这个逻辑的帮助。我相信的问题在于我的函数声明。错误信息是“表达式必须具有常量值”。这是代码......

// Jason Delgado
// 10/13/16 ©
// Chapter 9: Array Expander

// This program has a function that doubles the size of an array.
// It copies the contents of the old array to the new array, and
// initializes the unused elements to 0. The function then 
// returns a pointer to the new array. Pointer notation
// must be used for the function, and within the function.

#include <iostream>
using namespace std;

// Function protoype
int *arrExpander(int[] , int);

int main()
{
    // Create and initialize and array.
    const int SIZE = 6;         // Number of elements the array is to hold
    int oArr[SIZE] = { 10, 28, 34,
    5, 18 };                        // The original array

    int *nArr = nullptr;            // A pointer to hold the return value of the function.

// Call the arrExpander function and store it in nArr.
nArr = arrExpander(oArr, SIZE);

// Display the results
cout << "Original Array: ";
for (int count = 0; count < (SIZE); count++)
    cout << oArr[count] << " ";
cout << "\n\nNew Array: ";
for (int count = 0; count < (SIZE * 2); count++)
    cout << *(nArr + count) << " ";

system("pause");
return 0;

}

int *arrExpander(int arr[], int size)
{
    int *ptr = arr;
    const int DSIZE = size * 2;     // Doubles the size parameter
    int newArray[DSIZE];



}

1 个答案:

答案 0 :(得分:0)

分配给

的值
const int DSIZE = size * 2;

在创建后无法更改,但它取决于非常量值size,在每次调用arrExpander时,它可以,并且假定函数的名称可能应该不同。 / p>

int newArray[DSIZE];

编译器要求在编译程序时知道数组DSIZE的大小并保持不变,以便它可以调整堆栈大小并优化代码。如果在每次调用函数时都可以更改该值,DSIZE常量且在编译时已知,那么编译器会正确地拒绝此代码为无效。

有些编译器允许这种分配,即可变长度数组,但它不是标准的,并且不能在所有编译器上预期。由于存在许多缺点和更安全的解决方案,因此不太可能将支持添加到标准中。可变长度数组的一般立场是“为什么要打扰?Use std::vector instead.

这也有这个代码旨在增加现有数组大小的气味。它不能。 newArray是一个局部变量,在从函数返回时会被销毁,而“悬空指针”指向不再有效的内存。如果您希望此内存持续使用并返回std::vector或将newArray分配为new[]的动态分配指针,并在不再存在时记住delete[]数组必需的。

See std::unique_ptr用于内存管理帮助程序。