我有一个像这样的结构,
typedef struct Player {
char *name;
char *heroID;
char *heroName;
int slotNo;
} Player;
然后我将其定义为静态分配的数组
Player players[10];
当我没有完全分配char*
中每个Player
结构的所有players
字段时,我的程序可能必须退出。我已经决定在之前释放任何已分配的内存即使现代操作系统不需要你,因为这是一个很好的编程实践。
但是,我无法循环遍历players
和free(player[i].name)
等,因为它可能未初始化。
解决此问题的唯一方法是,在定义数组后手动将每个char指针初始化为NULL,然后在释放内存时,检查指针是否为NULL以决定是否应该释放它? / p>
如果是这样,当我通过使用大括号声明玩家阵列时,初始化,循环和手动分配或定义值的最佳方法是什么。或者还有另一种方式吗?
答案 0 :(得分:4)
解决此问题的唯一方法是,在定义数组后手动将每个char指针初始化为NULL,然后在释放内存时,检查指针是否为NULL以决定是否应该释放它? / p>
这绝对不是唯一的方法,但这是最常见和标准的方式。事实上,大多数程序员将始终将指针初始化为零以防止seg错误。
初始化的最佳方法是只创建一个for
循环或memset
一切为零(或使用calloc
,这是最简单的。)
答案 1 :(得分:3)
您可以使用calloc
创建指向结构的指针,以便将所有字段初始化为0(NULL
)。
将未使用的指针初始化为NULL 非常重要。如果没有这个,你就是了解seg故障的最好方法
修改(1)强>
当然,在您的场景中,您可以在每个结构中使用一些bool is_used
标志,但您可以使用NULL
指针做得更好。我没有理由以其他方式做到这一点。
答案 2 :(得分:3)
您可以像这样定义数组:
Player players[10] = { 0 };
这会将整个数组及其所有成员设置为0
(NULL
实际上是什么)。
答案 3 :(得分:1)
由于您的数组具有静态存储持续时间,因此它具有隐式初始化程序。您的代码等同于
Player players[10] = { 0 };
因此,无论您在分配它们时发生什么,都可以将这些指针传递给free
。
说了这么多,如果对malloc
的调用失败,如果对free
的后续调用也失败,也不会感到惊讶。一旦堆分配失败,中止该过程通常是合理的。