1

可能重复:
堆栈溢出可视 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 %d\n", NumPoints, DataBuffer[chunkSize-1]);

    return 0;
}

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

4

4 回答 4

4

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

编辑:

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

于 2012-07-11T14:12:52.147 回答
2

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

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

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

于 2012-07-11T14:14:02.937 回答
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;
于 2012-07-11T14:13:00.257 回答
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],因为数组是从零开始索引的。

于 2012-07-11T14:18:41.233 回答