指针数组中的 C++ 错误

Posted

技术标签:

【中文标题】指针数组中的 C++ 错误【英文标题】:C++ Error in array of pointers 【发布时间】:2013-07-23 16:57:16 【问题描述】:

我有一段代码:

int CPUs = GetNumCPUs();
FILE *newFile[CPUs];

我遇到了一个错误。它在第二行标记了“CPU”并说: “表达式必须有一个常数值”。

我尝试使用const,但它不起作用。

【问题讨论】:

C++ 没有可变长度数组。 FILE **newFile = new FILE*[CPUs];,或者更好,使用std::vector 您需要一个动态数组,因为 CPU 的数量不是“恒定的”——无法在编译时确定。与其纠结于 new 和 malloc,不如立即学习 std::vector 并养成使用它的习惯。 每当你用 C++ 编程并需要一个动态数组时,你应该想到std::vector 【参考方案1】:

您不能在 C++ 中拥有可变大小的数组。将const 添加到CPUs 并没有帮助,它只会使变量成为只读变量,但它仍然不是编译时常量,因为它是在运行时由函数初始化的。

通常的解决方案是使用向量:

std::vector<FILE*> newFile(CPUs);

【讨论】:

【参考方案2】:

GetNumCPUs() 的值可能会在每次运行程序时发生变化,也可能不会发生变化 - 因此它不是恒定的。如果您想要一个具有可变数量元素的数组,请尝试std::vector

std::vector<FILE*> newFile(GetNumCPUs());

【讨论】:

【参考方案3】:

在您的代码中,const 并不意味着“恒定”。在这种情况下,这意味着该对象是只读的 - 即您不能修改该对象。您正在尝试创建一个可变长度数组,这在 C++ 中是不允许的。使用std::vector,使用new 分配内存,或者编写一个C99 程序,其中允许像您尝试制作的VLA。

【讨论】:

谢谢各位 :) 我使用 FILE **newFile = new FILE*[CPUs];现在它正在工作:) 使用new 分配内存并不是一个真正的选择。 @user2320928:不要那样做 不错的编辑。起初我对此有疑问,因为您之前说过 const 并不意味着恒定 我不确定我是否遵循。 const 表示恒定。【参考方案4】:

在这种情况下,使用const 并不能解决所有问题。问题是数组必须在编译时初始化,所以如果你有一个函数返回一个变量(GetNumCPUs())并将它分配给一个常量(const int CPUs),这个变量在编译时是未知的,但在运行时是未知的,并且编译器无法为数组分配数据空间。

不过,使用std::vector 允许可变存储空间。

std::vector<FILE*> newFile(CPUs);

这应该可以正常工作。这里有几个教程:

http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm

http://www.dreamincode.net/forums/topic/33631-c-vector-tutorial/

【讨论】:

【参考方案5】:

CPU 在编译时是未知的。

【讨论】:

这个答案并没有真正解释为什么这是一个问题。 为什么不呢?你不能给某事分配一个未知的值。【参考方案6】:

您应该使用new[] 动态创建数组

int CPUs = GetNumCPUs();
FILE** newFile = new (FILE*)[CPUs];

完成后,您现在也有责任将其删除:

delete[] newFile;

【讨论】:

发帖人要数组,我给了他数组。我不理解每个人都在没有解释/理由的情况下推动std::vector&lt;&gt;

以上是关于指针数组中的 C++ 错误的主要内容,如果未能解决你的问题,请参考以下文章

将指向数组的指针传递给函数时出现分段错误(C++)

我可以使用 C++ 中的指针访问二维数组的元素吗?

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

指针数组 C++ 的分段错误

在 C++ 中使用指针初始化 char 数组或字符串

无法分配给 C++ 中的指针数组