Visual C++数组大小崩溃

Visual C++ Array Size Crash

本文关键字:崩溃 数组 C++ Visual      更新时间:2023-10-16

可能重复:
堆栈溢出视觉C++,潜在的数组大小?

此代码只是将二进制文件中的值读取到数组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 %dn", NumPoints, DataBuffer[chunkSize-1]);
    return 0;
}

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

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

编辑:

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

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

Microsoft开发人员中心-线程堆栈大小

也可以使用new关键字动态分配内存。

您的堆栈大小可能不够大,无法处理该大小的本地数据(假设这就是您所说的"崩溃"):

// 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;

在包括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 %dn", 
       NumPoints, DataBuffer[chunkSize-1]);

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