动态分配指向二维int数组的指针数组时遇EXC_BAD_ACCESS错误求助
问题分析与解决方案
嘿,我来帮你拆解下这段代码出问题的原因,以及怎么修复:
核心问题1:函数参数类型不匹配
你声明的pieces是int (*pieces)[10][10];,本质是一个指向int[10][10]二维数组的指针。但你的createPieces函数参数写成了int* (**pieces),这个类型和pieces的实际类型完全不兼容——相当于你试图用一个指向指针的指针去接收一个指向二维数组的指针,内存赋值逻辑完全混乱,这是后续内存访问错误的根源。
修正后的函数参数与实现
正确的函数参数应该是int (***pieces)[10][10](即指向“指向二维数组的指针”的指针),这样才能在外层函数修改pieces的指向。另外建议把元素数量作为参数传入,让函数更通用:
#include <stdlib.h> #include <stdio.h> #include <stdlib.h> void createPieces(int (***pieces)[10][10], int count) { // 分配count个int[10][10]数组的内存空间 *pieces = malloc(sizeof(int[10][10]) * count); // 必须检查malloc是否成功,避免空指针访问 if (*pieces == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } }
调用时需要传入pieces的地址:
int (*pieces)[10][10]; createPieces(&pieces, 12); // 12是你需要的数组数量
核心问题2:数组元素访问方式错误
你原来的(pieces+i)[x][y] = 1;写法不符合指针的访问逻辑。因为pieces是指向int[10][10]的指针,pieces+i是指向第i个int[10][10]数组的指针,必须先解引用这个指针才能访问数组内部的元素。
两种正确的访问方式
- 解引用指针后访问:
(*(pieces + i))[x][y] = 1;
- 更符合C语言习惯的下标写法(和上面等价):
pieces[i][x][y] = 1;
完整可运行的修正代码
#include <stdlib.h> #include <stdio.h> #include <stdlib.h> void createPieces(int (***pieces)[10][10], int count) { *pieces = malloc(sizeof(int[10][10]) * count); if (*pieces == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } } int main() { int (*pieces)[10][10]; int count = 12; createPieces(&pieces, count); // 初始化数组 for (int i = 0; i < count; ++i) { for (int x = 0; x < 10; ++x) { for (int y = 0; y < 10; ++y) { pieces[i][x][y] = 1; // 可选:打印验证初始化结果 // printf("pieces[%d][%d][%d] = %d\n", i, x, y, pieces[i][x][y]); } } } // 记得释放动态分配的内存,避免泄漏 free(pieces); return 0; }
额外提示
- 永远要检查
malloc的返回值,如果内存分配失败会返回NULL,直接访问会触发崩溃。 - 使用完动态分配的内存后一定要用
free释放,长期运行的程序内存泄漏会导致性能下降甚至崩溃。
内容的提问来源于stack exchange,提问作者Strauss
相关产品推荐
相关产品推荐

