此代码仅用于将二进制文件中的值读入数组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;
}
这次崩溃的原因是什么?我希望数组大小能够更高。
答案 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]
,因为数组从零开始索引。