当前位置:  开发笔记 > 程序员 > 正文

C:静态数组

如何解决《C:静态数组》经验,为你挑选了2个好方法。

我需要static void* array[1024];在库中有一个,我需要为每个条目设置为NULL.

我的问题是关于将整个数组设置为NULL memset (array, NULL, sizeof (void*) * 1024)的最佳方法,是最好的解决方案吗?



1> Christoph..:

static指针会自动初始化为NULL.见C99:TC3 6.7.8,§10:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:

如果它有指针类型,则将其初始化为空指针;

如果它有算术类型,则初始化为(正或无符号)零;

如果是聚合,则根据这些规则初始化(递归)每个成员;

如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.


而且,与其他人写的相反,

memset(array, 0, sizeof(array));

不保证会导致空指针.在某些系统上,设置为其所有位的指针0实际上可能有效.对于主流系统而言,情况并非如此,但对于嵌入式系统,人们永远不会知道.

将所有条目设置为空指针的安全方法是自行循环条目并将其设置为NULL,或者使用未初始化的static数组,您可以memcpy()在要设置的数组上使用它NULL.



2> paxdiablo..:
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;

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有