指针数组中的 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<>
。以上是关于指针数组中的 C++ 错误的主要内容,如果未能解决你的问题,请参考以下文章