我需要static void* array[1024];
在库中有一个,我需要为每个条目设置为NULL.
我的问题是关于将整个数组设置为NULL memset (array, NULL, sizeof (void*) * 1024)
的最佳方法,是最好的解决方案吗?
static
指针会自动初始化为NULL
.见C99:TC3 6.7.8,§10:
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:
如果它有指针类型,则将其初始化为空指针;
如果它有算术类型,则初始化为(正或无符号)零;
如果是聚合,则根据这些规则初始化(递归)每个成员;
如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
而且,与其他人写的相反,
memset(array, 0, sizeof(array));
不保证会导致空指针.在某些系统上,设置为其所有位的指针0
实际上可能有效.对于主流系统而言,情况并非如此,但对于嵌入式系统,人们永远不会知道.
将所有条目设置为空指针的安全方法是自行循环条目并将其设置为NULL
,或者使用未初始化的static
数组,您可以memcpy()
在要设置的数组上使用它NULL
.
static void* array[1024] = {0};
或者,正如kmkaplan在评论中指出的那样,只是:
static void* array[1024];
虽然我更喜欢第一个解决方案只是为了提醒我它被设置为零(编译器不应该生成任何代码,除非它已经死了).
您根本不需要对其进行memset,因为无论如何文件级变量都被初始化为零.
如果您需要在启动后的某个时刻将它们重置为NULL,请使用:
memset(array, 0, sizeof(array));
这适用于大多数平台(我见过的每一个平台都非常多)因为空指针通常是零位.但是标准并不能保证这一点,在那些不起眼的平台上,它更安全:
for (i = 0; i < sizeof(array) / sizeof(void*); i++) array[i] = NULL;