是 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
因此不一定是全零位模式。
Posix 与 C 标准没有不同的保证。但是,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.
因此,如果 ptr
和 ptr2
都是空指针,则 ptr == ptr2
的计算结果为 true
。但是,memcmp(&ptr, &ptr2, sizeof(ptr))
可能不会计算为 0
。
我可以将指向 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
因此不一定是全零位模式。
Posix 与 C 标准没有不同的保证。但是,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.
因此,如果 ptr
和 ptr2
都是空指针,则 ptr == ptr2
的计算结果为 true
。但是,memcmp(&ptr, &ptr2, sizeof(ptr))
可能不会计算为 0
。