访问庞大的数组时,C ++程序会冻结

时间:2012-07-19 18:46:53

标签: c++ arrays vector

other question中的

我问如何编译一个包含大量数据的向量,因为我想要一个带有107776个词条的向量,我无法编译它。

由于this answer的代码,我解决了这个问题:

char const * const dict[] = {"aaron",...};

但现在的问题是,当我尝试访问一个条目时......

cout<<dict[431104]<<endl;

...程序冻结,Windows想关闭它。

为什么会这样?我该如何解决?

编辑:抱歉,这是我的错。正如tbroberg和Seth Carnegie在this answer注意到的那样,错误在于我认为sizeof(dict)是数组的长度(而不是sizeof(dict)/sizeof(*dict))。 因此,431104远远超出了数组的范围(其长度为107776)。

2 个答案:

答案 0 :(得分:3)

您正在堆栈上分配107776 char*,这可能足以导致计算机上的堆栈溢出。您可以尝试在堆上分配char*并使用初始化列表:

const char** dict = new const char*[107776] {"aaron",...};

// ... use dict

delete[] dict;

这应解决问题(如果问题是堆栈大小,我认为是这样)。

另外,我刚刚注意到你的索引431104远远超出了数组的范围,大小为107776(之前我把它误读为100万)。你确定你的问题不仅仅是超出范围的指数吗?

答案 1 :(得分:0)

尝试将static放在const之前:

static const char *const dict [] = { "a...", ...

现在它被分配在初始化的数据段中。根据您的平台和编译器/链接器的功能,它可能正常工作。

操作系统通常会处理这些数据的缓存/交换,因此如果数据确实是不可变的,那么它就是首选方法。