代码之家  ›  专栏  ›  技术社区  ›  claf

C:静态数组

  •  5
  • claf  · 技术社区  · 17 年前

    我需要一个 static void* array[1024];

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

    5 回复  |  直到 17 年前
        1
  •  26
  •   Community Mohan Dere    5 年前

    static 指针会自动初始化为 NULL

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

    • 如果它有算术类型,则初始化为(正或无符号)零;
    • 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。

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

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

    将所有条目设置为空指针的安全方法是自己在条目上循环并将其设置为空指针 ,或使用未初始化的 memcpy() 在要设置为的阵列上 无效的 .

        2
  •  9
  •   paxdiablo    17 年前
    static void* array[1024] = {0};
    

    或者,正如卡普兰在评论中指出的那样,只是:

    static void* array[1024];
    

    尽管我更喜欢第一个解决方案,只是为了提醒我它被设置为零(编译器不应该为此生成任何代码,除非它是脑死亡的)。

    如果你需要 重置

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

    这适用于大多数平台(我所见过的每一个平台,这相当多),因为空指针通常是零位。但标准并不能保证这一点,因此,在那些晦涩难懂的平台上,更安全的做法是:

    for (i = 0; i < sizeof(array) / sizeof(void*); i++)
        array[i] = NULL;
    
        3
  •  3
  •   kgiannakakis    17 年前

    memset将在运行时执行此操作。

    static void* array[1024] = {0};
    

    Pax建议在编译时执行此操作,并将增加可执行文件的大小。

        4
  •  1
  •   Gal Goldman    17 年前

    您所需要的只是:

    
    static void* array[1024];
    

    因为静态变量无论如何都初始化为0,所以您实际上不需要启动这个数组,它会自动发生。

        5
  •  0
  •   Mehrdad Afshari    17 年前

    memset(array, 0, sizeof(array)); // this works only on static arrays.
    

    一般来说,您应该使用:

    memset(array_reference, 0, size_of_array * sizeof(array_element_type));