是 memset(&ptr, 0, sizeof(ptr));与 ptr=NULL 相同;?

Is memset(&ptr, 0, sizeof(ptr)); the same as ptr=NULL;?

我可以将指向 NULL 的指针设置为零(至少根据 POSIX 标准),方法是将其记忆设置为零吗?或者甚至记忆设置包含它的结构(它真正有用的地方)?

编辑:POSIX 在 stddef.h(0posix) 中指定 NULL 应为 (void *) 0,但这可能不足以允许 memset()。如果 POSIX 对此定义了任何其他细节,我将忽略。

C 中,memset(&ptr, 0, sizeof(ptr)) 不一定与 ptr=NULL 相同,因为 ISO/IEC 9899:1999 条款 17.7 第 3 段说 NULL

expands to an implementation-defined null pointer constant

因此不一定是全零位模式。

PosixC 标准没有不同的保证。但是,next revision draft 表示

POSIX additionally guarantees that any pointer object whose representation has all bits set to zero, perhaps by memset() to 0 or by calloc(), will be interpreted as a null pointer.

因此似乎 Posix 将保证 memset(&ptr, 0, sizeof(ptr))ptr=NULL 具有相同的效果(这很可能已经所有现有实现的情况)。但是,这些语句不一定会将相同的位模式分配给 ptr.

重要的是要注意 C 标准(和 Posix,也有提到的更新)保证空指针的位模式是唯一的。因此,原则上 ptr=NULL 可以将与 memset(&ptr, 0, sizeof(ptr)) 不同的位模式分配给 ptr,只要该位模式也是空指针即可。

标准保证(条款 6.3.2.3 第 4 段)

Any two null pointers shall compare equal.

因此,如果 ptrptr2 都是空指针,则 ptr == ptr2 的计算结果为 true。但是,memcmp(&ptr, &ptr2, sizeof(ptr)) 可能不会计算为 0