Visual C ++数组大小崩溃

时间:2012-07-11 14:08:28

标签: c++ arrays visual-c++ crash stack

  

可能重复:
  Stack overflow visual C++, potentially array size?

此代码仅用于将二进制文件中的值读入数组DataBuffer。当DataBuffer的大小大于或等于515000时,它只会崩溃。我在Windows 7上的Visual C ++ 2010中开发它。函数cbFileRead()是我无法访问的源代码。 cbFileRead()期望DataBuffer的类型为USHORT *。

#include <stdio.h>  // printf()
#include "cbw.h"    // cbFileRead()

int main(int argc, char* argv[]) {

    // Declarations
    char* FileName = argv[1];
    long FirstPoint = 0;
    long NumPoints;

    // Set data collection sizes
    const long chunkSize = 515000;
    NumPoints = chunkSize; // Number of points to be read into mem
    WORD DataBuffer[chunkSize-1];

    // Get data
    cbFileRead(FileName, FirstPoint, &NumPoints, DataBuffer);

    printf("Completed on data point %d whose value is %d\n", NumPoints, DataBuffer[chunkSize-1]);

    return 0;
}

这次崩溃的原因是什么?我希望数组大小能够更高。

4 个答案:

答案 0 :(得分:4)

printf()超出了数组DataBuffer的末尾,因为它有chunksize - 1元素,因此最后一个元素是chunksize - 1 - 1。函数cbFileRead()(可能)也误导了DataBuffer中元素的数量。

编辑:

正如其他人已经说过的那样,默认堆栈大小为1MB。 DataBuffer数组的大小为2 * 515000,等于1030000,这会在堆栈上留下18576个空闲字节。 cbFileRead()可以很容易地在堆栈上声明一个大缓冲区来读取文件。根据其他人的建议,使用DataBuffer(和new[]免费)或使用delete[]在堆上分配vector<WORD>

答案 1 :(得分:2)

  

链接器使用的默认堆栈保留大小为1 MB。至   为所有线程指定不同的默认堆栈预留大小   光纤,在模块定义中使用STACKSIZE语句(.def)   文件。

Microsoft Dev Center - Thread Stack Size

或者您可以使用new关键字动态分配内存。

答案 2 :(得分:1)

您的堆栈大小可能不足以处理该大小的本地数据(假设这是“崩溃”的意思):

// use dynamic allocation instead of stack local
WORD *DataBuffer = new WORD[chunkSize];

cbFileRead(FileName, FirstPoint, &NumPoints, DataBuffer);

// ...use DataBuffer...

// deallocate DataBuffer when done
delete[] DataBuffer;

答案 3 :(得分:1)

在大多数平台上,包括Windows,局部变量存储在堆栈上,堆栈的大小有限 - 在这种情况下,它看起来大约是1MB。如果你真的需要,可能有办法增加这个大小,但动态分配大型数组会更好:

#include <vector>

std::vector<WORD> DataBuffer(chunkSize); // guessing that "chunkSize-1" was an error

cbFileRead(FileName, FirstPoint, &NumPoints, &DataBuffer[0]);

printf("Completed on data point %d whose value is %d\n", 
       NumPoints, DataBuffer[chunkSize-1]);

请注意,如果数组大小实际上应该是chunkSize-1,那么最后一个元素将是DataBuffer[chunkSize-2],因为数组从零开始索引。