我正在学习写一个原生扩展,我注意到一个奇怪的事件。当我分配一个多维数组并像这样访问它时:(请原谅任何凌乱的C代码和我可能使用的不良实践,除非它们可能是我的错误的原因。我的C不是那么好)
int table[rows][cols]; //rows and cols are both > 1
memset(table, 0, sizeof(int) * rows * cols);
如果我执行类似
的操作,我会遇到分段错误table[rows-1][cols-1];
但如果我像这样分配表:
table = (int**)malloc(XLEN * sizeof(int *));
if (table == NULL) {
... error ...
}
for (i=0; i < XLEN; i++) {
table[i] = (int*)malloc(YLEN * sizeof(int));
if (table[i] == NULL) {
... error ...
}
memset(table[i], 0, sizeof(int) * YLEN);
}
然后一切正常。为什么会这样?
答案 0 :(得分:1)
也许问题在于,在第一种情况下你在堆栈上分配一个数组? 如果您将在函数外部使用对此数组的引用(在函数返回之后),您将始终遇到分段错误。
请举一个使用数组的小例子,你会得到更多有用的建议。