我问如何编译一个包含大量数据的向量,因为我想要一个带有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)。
答案 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...", ...
现在它被分配在初始化的数据段中。根据您的平台和编译器/链接器的功能,它可能正常工作。
操作系统通常会处理这些数据的缓存/交换,因此如果数据确实是不可变的,那么它就是首选方法。