确定C ++数组的正确大小

时间:2010-03-03 15:33:40

标签: c++

我需要能够根据文件中的字节数设置数组的大小。

例如,我想这样做:

// Obtain the file size.
    fseek (fp, 0, SEEK_END);
    size_t file_size = ftell(fp);
    rewind(fp);

// Create the buffer to hold the file contents.
    char buff[file_size];

但是,我得到一个编译时错误,说缓冲区的大小必须是常量。

我该如何做到这一点?

5 个答案:

答案 0 :(得分:10)

使用矢量。

std::vector<char> buff(file_size);

整个矢量首先自动填充'\ 0'。但是“失去”的表现可能并不明显。它当然更安全,更舒适。然后像通常的数组一样访问它。您甚至可以将指向数据的指针传递给传统C函数

legacy(&buff[0]); // valid!

答案 1 :(得分:2)

您应该使用std::vector而不是数组。

真实数组要求您指定它们的大小,以便编译器可以为它们创建一些空间 - 这就是当您不提供常量整数时编译器会抱怨的原因。动态数组由指向数组基础的指针表示 - 您必须自己检索动态数组的内存。然后,您可以使用带有下标表示法的指针。如,

int * x;
x = (int *) malloc( sizeof(int) * 
                    getAmountOfArrayElements() /* non-const result*/ 
                  );
x[5] = 10;

这会导致两类问题:

  1. 缓冲区上/下流:您可能会在数组的任一端下标索引。

  2. 您可能忘记释放内存。

  3. Vector提供了一个很好的小界面来隐藏这些问题 - 如果使用得当的话。

答案 2 :(得分:1)

替换

char buff[file_size];

char *buff = new char[file_size];

一旦使用了buff,你就可以使用以下内容释放内存:

delete[] buff;

答案 3 :(得分:1)

我想提出的问题有两点。

  1. 实际问题,你如何创建数组。约翰内斯回答了这个。您使用std :: vector并使用大小分配创建它。
  2. 您的错误讯息。声明某种类型的数组时,必须使用常量大小声明它。例如,

    const int FileSize = 1000;

    // stuff

    char buffer [FileSize];

  3. 完全合法。

    另一方面,你所做的,试图声明一个大小可变的数组,然后不用 new 分配,会产生错误。

答案 4 :(得分:-3)

问题是需要在堆上创建buff(而不是堆栈)。编译器希望知道在堆栈上创建的确切大小。

char* buff = new char[file_size];