我正在用 C 语言编写一个小型控制台游戏。该游戏是一个 3D 扫雷游戏,可以沿轴线调整场地的长度。我将游戏字段存储在一个变量中field
,该变量是一个动态数组,其元素是字符串(即长度为 3 的字符数组)。因此该字段是一个二维字符数组(如果我对指针/数组逻辑的理解是正确的)。
在编写程序的过程中,我决定按照“一个功能-一个文件”的原则将代码拆分到多个文件中。我将负责内存分配的那段代码原封不动地移到了函数中int mem(char** field, size_t field_size)
。
代码本身:
int mem(char** field, size_t field_size)
{
size_t i;
field = malloc(field_size * sizeof(field[0]));
if (field == NULL) {
free(field);
return 1;
}
for (i = 0; i < field_size; i++)
field[i] = NULL;
for (i = 0; i < field_size; i++) {
field[i] = malloc(3 * sizeof(field[0][0]));
}
for (i = 0; i < field_size; i++) {
if (field[i] == NULL) {
free_field(field, field_size);
return 2;
}
}
return 0;
}
函数free_field(field, field_size)
——一个手写函数,用于释放在字段中分配的内存。
问题是,将此逻辑移至单独的文件后,field
调用该函数后,默认的 NULL 仍保留在变量中。而且检查发现,函数内部的内存分配是正确的(函数本身内部肯定是被调用的main()
,所以问题不在于我忘记写它的调用)。所以我怀疑问题在于field
它开始被视为函数本身的内部变量,并且内部的任何更改都不会影响field
主程序中的原始变量。
我是否正确理解了这种情况?纠正它的最佳方法是什么?我是否应该重写该函数以便它接收的不是自身field
而是对它的引用?
等等。
但考虑到你没有清除旧的
field
,你可以做得更好(我还没有测试过,但你明白我的意思):@0andriy 在对我的问题的评论中建议的解决方案被证明是最方便和最简单的解决方案。以下是最终函数的完整代码:
PS:关于结构的评论确实是有效的,但是该项目是为了教育和实践目的而编写的,所以我
calloc()
在最终版本中没有使用函数。