1

另一个问题中,我问如何编译一个包含大量数据的向量,因为我想要一个包含 107776 个条目的字典的向量,但我无法编译它。

由于这个答案的代码,我解决了它:

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

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

cout<<dict[431104]<<endl;

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

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

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

4

2 回答 2

3

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

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

// ... use dict

delete[] dict;

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

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

于 2012-07-19T19:09:30.977 回答
0

尝试把static之前const

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

现在它被分配在初始化的数据段中。根据您的平台和编译器/链接器的能力,它可能会起作用。

操作系统通常会负责缓存/交换这些数据,所以如果数据真的不可变,它是首选方法。

于 2012-07-19T19:21:52.303 回答