【问题标题】:C++ Error in array of pointers指针数组中的 C++ 错误
【发布时间】: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

标签: c++ arrays file pointers


【解决方案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;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        • 2015-06-16
        相关资源
        最近更新 更多