通过传递函数的长度来声明函数内部的数组

时间:2019-04-24 18:28:37

标签: c++ function const

我想要一个函数,该函数需要一个正整数,然后声明一个数组,对其进行初始化并打印。以下代码适用于GCC编译器,但不适用于MSVC编译器。我得到了错误

  

错误(有效)E0028表达式必须具有恒定值。参数“ Length”的值(在第5行声明)不能用作常量

  1. 用MSVC编译器执行此操作的一种好方法是什么?和
  2. 这种差异是否有很好的理由?

我的代码:

#include <iostream>

using namespace std;

void Print(const int Length)
{
    int Array[Length];
    for (int i = 0; i <= Length - 1; i++)
    {
        Array[i] = i;
        cout << Array[i];
    }
}

int main()
{
    const int L = 5;
    Print(L);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,您绝对应该使用std::vector<int>

如果您希望数组仅存在于函数Print中,则可以使用new在堆栈上声明一个动态数组。不过,请注意存储器的使用情况,因为Print可能会被大量调用,这会导致堆栈溢出(再次,请使用vector来避免这种情况)。

#include <iostream>

using namespace std;

void Print(const int Length)
{
    int *Array = new int[Length];
    for (int i = 0; i < Length; i++)
    {
        Array[i] = i;
        cout << Array[i];
    }
    delete [] Array;
}

int main()
{
    const int L = 5;
    Print(L);
    return 0;
}

编辑:这是基于矢量的正确解决方案:

#include <iostream>
#include <vector>

using namespace std;

void Print(const int Length)
{
    vector<int> Array;
    Array.resize(Length);
    for (int i = 0; i < Length; i++)
    {
        Array[i] = i;
        cout << Array[i];
    }
}

int main()
{
    const int L = 5;
    Print(L);
    return 0;
}

答案 1 :(得分:0)

如果您确实要动态分配固定大小的数组,请使用std :: unique_ptr而不是std :: vector。

#include <iostream>
#include <memory>

void Print(const int Length){
    std::unique_ptr<int[]> Array = std::make_unique<int[]>(Length);
    for (int i = 0; i < Length; ++i){
        Array[i] = i;
        std::cout << Array[i];
    }
    Array.reset();
}