在C++中运行时创建静态数组

3

有没有办法在运行时创建C++中的静态数组。 我想要的非常简单,只是想从用户获取输入数字并在运行时创建大小为输入数字的静态数组。不需要使用new操作符,也不需要指针,只需要静态数组。


1
一个数组被声明为static,对你来说意味着什么? - Ben Voigt
1
你的意思应该是“自动存储期”,而不是“静态存储期”吧? - Lightness Races in Orbit
我认为你可能混淆了 static 的含义(不幸的是,这个术语有很多重载)。如果你能描述一下你所说的“static”的含义,那么可能会有助于澄清情况。 - Martin York
6个回答

5
在程序代码实际运行之前(即在调用main之前),不会分配任何static变量。您需要的是动态(在运行时创建的)数组。如果您想避免使用new,则可以在堆栈上创建它(通过将参数传递给将创建它并在该函数内部处理它的函数),但这与static不同。您还可以使用模板容器来为您分配和调整大小(例如其他答案中提到的std::vector)。 编辑 似乎有些人对我没有提及初始化static对象的问题感到困扰。虽然与问题无关,但值得知道静态成员变量或作用域内的静态变量可以在运行时初始化,但它们的空间在main之前保留,因此变量的大小不能更改。

1
我不确定OP所说的“static”的含义。 - Lightness Races in Orbit
存储空间是在程序启动之前创建的...构造函数何时运行取决于它是全局的、类静态成员还是局部静态成员。 - Ben Voigt
@littleadv:数组构造包括为每个元素运行构造函数。 - Ben Voigt
阅读你的回答,我会认为我无法将在运行时确定的参数传递给静态局部变量的构造函数,但事实并非如此。 - Ben Voigt
@littleadv:这是第一个完整的句子:“static变量在程序代码实际运行之前就被创建了”。 “created”表示构造函数运行。你可能正在寻找“allocated”或“storage is reserved”。 - Ben Voigt

4
如果您的意思是
unsigned size;
std::cin >> size;
int arr[size];

答案是: 不行。C99有一个叫做变长数组的特性,但是C++03(和'0x)标准没有这种特性。


我想你的意思是 std::cin ;) - Marlon
在我的回答中,我描述了如何在C++中使用alloca来在堆栈上分配内存,这相当于C99的可变长度数组。 - Aaron McDaid

3

使用alloca函数在堆栈上分配空间,类似于静态数组或C99变长数组。

#include <iostream>
#include <alloca.h>
int main() {
        unsigned sz;
        std :: cin >> sz;
        int * p = static_cast<int*>(alloca(sz * sizeof(int)));
        // do stuff with p, do not attempt to free() it
}

我只在C中使用过它,但是它的效果很好。不过建议先阅读相关资料,它可能不太可移植。


1

不需要。

根据定义,您需要在运行时动态分配任何大小未知的内容。这就是为什么有new和相关函数存在的原因。


0

数组是静态的,这对您意味着什么?您认为它有哪些优势?

实际上,任何静态变量(包括数组)都在程序开头预留了其存储空间。因此,在程序开始运行之前必须知道其大小,因此它不能以任何方式依赖用户输入。

然而,有许多方法可以创建动态的非静态数组,请告诉我们您想要做什么。


不是我,但我并不确定这是否严格回答了问题。这不更像是一条评论吗? - Lightness Races in Orbit
请勿回答非问题。问题只能用“是”或“否”回答,而不能用“我不知道你的意思”。如果您愿意,可以将其作为评论发表。从您的回答中我理解的是您不知道,那么何必浪费时间呢? - littleadv

0

听起来你想要的是一个数组,它的大小在运行时定义,但其生命周期由静态存储期(即程序的长度)定义。

你不能使用语言中内置的基本数组。这些对象的大小在编译时定义,无法在运行时修改。但有几个替代方案。

基本的std::vector可能是你想要的:

std::vector<int>    data;

int main()
{
    int size;
    std::cout << "Input the size of the array\n";
    std::cin >> size;

    // This line sets the size of the container
    // vector is basically a C++ wrapper around a dynamically sized array
    data.resize(size);

    // Now we can safely read values into the array (like) container.
    for(int loop =0;loop < size;++loop)
    {
        std::cout << "Input Value " << loop << "\n";
        std::cin >> data[loop];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接