c++ - memset 或 bzero 是否保证结构中的字段指针将被清零?

标签 c++ pointers memset

假设你有一个 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...

最佳答案

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

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

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

关于c++ - memset 或 bzero 是否保证结构中的字段指针将被清零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13187570/

相关文章:

c++ - Oracle OCI 获取最后插入行的 ID

C,将文件指针作为参数传递给函数

c++ - 我们如何在 C++ 中初始化一个全为 0 的 vector

C 当尝试calloc最大可用内存时,没有NULL返回

C++ 类型 'double' 和 'const char [5]' 到二进制 'operator+' 的无效操作数

c++ - 寻找一个C++开源的矩阵存储库

c++ - 如果我使用 startDetached 启动 QProcess,我会得到一个完成的插槽吗

c - 如何将数组的地址传递给函数?

使用别名更改指针指向的值

c - C 中 memset 的行为