4

假设你有一个 C++ 类 Foo,你说:

Foo* foos = new Foo[SOME_CONSTANT];
memset(foos, 0, sizeof(Foo)*SOME_CONSTANT);
//or the bzero equivalent

并且 Foo 有一个数据成员Bar* barPtr。上述操作会保证 barPtr 为 NULL 吗?(即零)。我在 gdb 中遇到了一个案例,这不适用于 memset,我很好奇为什么。

我知道以上可能是不好的做法,但我是出于好奇。

我意识到我有一个额外的,我在 memset 中做 sizeof(Foo )*SOME_CONSTANT ......

4

2 回答 2

4

一方面,它是实现定义的。memsetbzero将用全零位模式填充指针值,这不能保证是给定平台上空指针的物理表示。它甚至不能保证产生一个有效的指针值,这意味着你最终可能会得到所谓的陷阱表示,它在访问时会触发未定义的行为。

另一方面,bzero是(或曾经是)POSIX 规范的一部分。如果内存服务,POSIX 要求(或至少曾经要求)空指针由全零位模式表示,这意味着在 POSIX 系统上它确实会将指针设置为空。

但同样,POSIX 提供的保证只是我回答的第一部分中提到的特定于实现的属性的一个示例。语言(C 或 C++)不提供此类保证。

于 2012-11-02T00:34:53.093 回答
3

不,空指针的表示不需要全部为零。

请参阅comp.lang.c FAQ第 5 节问题 7.31

于 2012-11-02T00:30:38.300 回答