我一直在搜索过去关于这个主题的讨论,我理解数组需要有一个常量值,但是我通过一个变量给它一个常量值,但是它没有用。我需要这个逻辑的帮助。我相信的问题在于我的函数声明。错误信息是“表达式必须具有常量值”。这是代码......
// 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];
}
答案 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
用于内存管理帮助程序。