2012-07-11 30 views
1

可能重复:
Stack overflow visual C++, potentially array size?的Visual 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; 
} 

这个崩溃有什么原因?我希望阵列大小能够变得更高。

+0

默认情况下,您通常会有一个非常小的堆栈。我会使用'std :: vector'而不是 – Flexo 2012-07-11 14:10:40

+2

这看起来像C,而不是C++?为什么它被标记为C++? – 2012-07-11 14:11:03

+3

Windows中的堆栈大约为1MB(或2),IIRC。 – nhahtdh 2012-07-11 14:11:32

回答

2

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

Microsoft Dev Center - Thread Stack Size

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

+0

谢谢。我刚发现'new'能够做到这一点。 – 2012-07-11 14:29:57

4

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

编辑:

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

+0

+1,这也是一个问题(没有足够的滚动他的代码!)。 – user7116 2012-07-11 14:13:43

+0

谢谢。 FirstPoint = 0,所以我认为'cbFileRead()'得到正确的数字。我想'chunkSize'元素,所以它们存储在'chunkSize() - 1'的数组中。因为数组也是空索引的,所以数组的最后一个元素是'chunkSize() - 2'。是对的吗? – 2012-07-11 14:29:00

+0

@thoughtadvances,但数组被声明为具有'chunkSize - 1'元素。如果它有'chunkSize'元素,则有效索引从'0'到'chunkSize - 1'。 – hmjd 2012-07-11 14:32:52

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; 
+0

+1可能是由于此原因返回的。 – hmjd 2012-07-11 14:20:26

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],因为数组从零开始编号。