Visual C++数组大小崩溃
Visual C++ Array Size Crash
可能重复:
堆栈溢出视觉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]
,因为数组是从零开始索引的。
- 类对象数组的问题会导致崩溃
- 字节数组初始化会导致 DirectX 崩溃
- 使用 sf::Text 数组时崩溃
- For 循环在尝试读取数组 c++ 时程序崩溃
- 删除数组 c++ 崩溃问题
- 如果类的成员,C++数组会导致崩溃
- 在C++中删除指针数组时析构函数崩溃
- 在 C++ 中使用平展数组语法,崩溃取决于宽度/高度
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- 释放字符的动态数组时崩溃
- size_t结构非数组成员崩溃的强制转换
- C++程序在迭代到数组的最后一个元素时崩溃
- 从数组比较2个字符串时,程序崩溃
- C++ 尝试向类内的数组(或向量)添加值时程序崩溃
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 尝试获取数组中的最小元素时崩溃
- 动态数组在构造函数处崩溃
- 使用数组的单向链表:它在运行时崩溃
- C 程序崩溃(数组和2个指针Binsearch功能)