考虑以下void
指针数组的初始化:
#include <string.h>
void foo()
{
void * a[10];
memset(a, 0, sizeof a);
// ...
}
在memset
调用后,数组是否保证保留NULL指针?
答案 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
相同,但无法保证。这取决于硬件架构+操作系统+编译器。
您问题的简短回答是:否。