2013-04-29 97 views
1

我想不出有什么用下面的代码的问题崩溃,它只是崩溃而不outputing任何内容到屏幕上:C++程序与结构声明数组

#include <cstdlib> 
#include <iostream> 
using namespace std; 

typedef struct { 
    unsigned int recid; 
    unsigned int num; 
    char str[120]; 
    bool valid; 
} record_t; 

typedef struct { 
    unsigned int blockid; 
    unsigned int nreserved; 
    record_t entries[100]; 
    bool valid; 
    unsigned char misc; 
} block_t; 

int main(){ 
    cout << "Before Buffer" << endl; 
    block_t buffer[1000]; 
    cout << "After Buffer" << endl; 
    return 0; 
} 

我试图Qt的调试器和GBD和他们只显示分段故障并指向主功能的开始。

每个block_t元素的大小为13.2 Kbs,所以缓冲区数组的大小应该在13Mb左右。也许这对C阵列来说太过分了?

+0

如果你认为它是数组的大小,那么你有没有尝试过更小的尺寸? – 2013-04-29 01:57:53

+0

我应该对100GB数据进行外部排序,只是给出这个缓冲区我不认为我不能存储它13MB的内存......我一定是缺少...... – 2013-04-29 02:01:41

+1

你的数组可能比你的堆栈大空间。使用堆空间(例如'block_t ** b =(block_t **)malloc(sizeof(block_t)* 1000);')。 – 2013-04-29 02:03:16

回答

3
block_t buffer[1000]; 
可能使用你所有的堆栈空间

(要求大于1000 * 100 * 120 * 1字节假设ASCII约等于12MB,不考虑那些结构等领域),因此,你会得到一个分段错误。

尝试使用:

block_t * buffer = new block_t[1000]; 

std::vector代替或者如果可能增加您的栈空间更大的尺寸。

+0

谢谢不知道除了能够在运行时分配以外,这两个有很大的区别 – 2013-04-29 02:19:23

+0

@ParisP不客气 – taocp 2013-04-29 02:22:01

2

您的buffer变量大约为13MB - 对于堆栈分配太大。