memset一个void指针数组

时间:2015-03-24 07:59:33

标签: c arrays pointers null memset

考虑以下void指针数组的初始化:

#include <string.h>

void foo()
{
    void * a[10];
    memset(a, 0, sizeof a);
    // ...
}

memset调用后,数组是否保证保留NULL指针?

3 个答案:

答案 0 :(得分:4)

不,这不保证。将0转换为指针类型定义为生成空指针[6.3.2.3.3],但是在这里您要将指针的对象表示设置为所有零字节。标准没有指定指针的对象表示,因此是一个全零字节指针或者可能不是空指针。

我认为您的问题不需要提及数组,因为询问p现在是否为空指针取决于同一问题:

void *p;
memset(&p, 0, sizeof p);

答案 1 :(得分:3)

没有。根据{{​​1}},整数常量或零表达式将转换为空指针。但是,类型的基础表示C11 6.3.2.3 Pointers /3指定,其中6.2.6表示:

  

除非本条款中另有说明,否则所有类型的陈述均未指明。

鉴于该部分中没有关于指针的内容,你不能假设空指针都是零位,这是你从/1调用得到的(两者都不是{允许{1}}或memset()具有填充位,并且在所有可能的编码中以相同的方式表示正零。)

更安全的方法是:

signed char

如果您知道全零位是实现中空指针的正确底层表示,则可以使用 unsigned char,但它不会是可移植的。考虑到不使用该表示的机器数量(如果有的话,很少),这可能不是问题。请注意可能的后果。

答案 2 :(得分:2)

如果您将NULL放入其中,则为是,它将保留NULL秒。

但你填充零,0 可能会发生NULL相同,但无法保证。这取决于硬件架构+操作系统+编译器。

您问题的简短回答是: