在C中分配2d堆数组导致一致Seg错误
我正在创建一个这样的二维数组在C中分配2d堆数组导致一致Seg错误,c,multidimensional-array,segmentation-fault,C,Multidimensional Array,Segmentation Fault,我正在创建一个这样的二维数组 int** B = calloc(16, sizeof(int*)); for(int i = 0; i <= 16; i++){ B[i] = calloc(16, sizeof(int)); } 我有一个分割错误 我尝试了很多东西,但都没有成功 编辑:解决了 结果是我使用&B将数组B传递给函数,而不是仅使用导致问题的B,尽管我在修复此错误之前实现了下面建议的更改,因此可能会遇到下一个越界问题。在for循环中,你的条件是ii分配数组的指针列表不是2D
int** B = calloc(16, sizeof(int*));
for(int i = 0; i <= 16; i++){
B[i] = calloc(16, sizeof(int));
}
我有一个分割错误
我尝试了很多东西,但都没有成功
编辑:解决了
结果是我使用&B将数组B传递给函数,而不是仅使用导致问题的B,尽管我在修复此错误之前实现了下面建议的更改,因此可能会遇到下一个越界问题。在for循环中,你的条件是
ii分配数组的指针列表不是2D数组。@ggorlen对我来说:[16]也是OOB。你能告诉我你在编写哪个C(标志,版本…)吗?我不感谢你的帮助,但我还是很困惑。当分配B[1][0]时,我是如何越界的?这些不应该是我初始化的第一个数组或cally您在B[I]=calloc(16,sizeof(int))上的越界代码>其中i==16
。见我在上面评论中的解释。数组是0索引的。当B[1][0]=1时,碰撞可能立即发生或者它可能根本不会发生(这就是UB的本质)。所以你不能看着崩溃点就认为这就是问题所在。使用valgrind或asan之类的内存检查器调试这些问题。希望这有意义!是 啊valgrind您能否提供更多关于它为何崩溃的信息。@ggorlen感谢您迄今为止的帮助。不幸的是我换了好的,没问题。您是否可以编辑您的问题以显示您正在使用的确切代码?这样,我可以运行它并查看问题。
B[1][0] = 1;