c - C 结构 TriplePointer 内存分配
问题描述
我有这两个结构:
typedef struct {
unsigned int rows;
unsigned int cols;
Cell ***cells;
} Board;
typedef struct {
unsigned int info;
unsigned char state;
unsigned int mines;
} Cell;
初始化板结构:
board = (Board*) malloc(sizeof(Board));
board->rows = 2;
board->cols = 2;
board->cells = NULL;
之后我调用这个函数:
int initCells(Board **board) {
Cell **cells = (Cell**) malloc((*board)->rows * sizeof(Cell*));
for (int i = 0; i < (*board)->rows; i++) {
cells[i] = (Cell*) malloc((*board)->cols * sizeof(Cell));
}
(*board)->cells = &cells;
(*board)->cells[0][0]->info = 7;
(*board)->cells[0][1]->info = 7;
(*board)->cells[1][0]->info = 7; // segmentation fault
return 0;
}
为什么我会出现第三个分段错误,将内存分配给三重指针的正确方法是什么?
解决方案
(*board)->cells = &cells;
这会将板单元指针设置为指向函数中的局部变量。当函数返回时,该指针不再有效。
看起来你的指针级别太多了。没有理由我可以看到第三级。
参数上的第二级也board
只是使事情复杂化,但完全是多余的。
推荐阅读
- php - 字段为空时 ACF if 语句不起作用
- sql - Visual Studio 代码与 SQL 格式化
- reactjs - 反应中的功能图
- symfony - 使用 PHP Doctrine ORM 加入 0..n / 0..n 关系链接的 2 个表
- java - 线程“主”java.lang.NoSuchFieldError 中的异常:LINUX
- regex - 为什么这种模式在 awk 中会失败?
- python - Dask worker 的内存清理
- c# - Blazor (c#) DXDatagrid (devexpress):用图标替换默认命令按钮时,主从编辑器出现问题
- c - 将 bin 文件中的字符串转换为 fgets() 字符串
- c - C 动态分配的结构对象导致运行时错误(“分段错误(核心转储)”)