c语言 - memset(&obj, 0, sizeof obj) 是否比用 {0} 初始化更不便携?



我最近遇到了GCC的错误,它阻止用{0}初始化一些东西。在bug报告中,报告它的人说:

C标准库中的经典示例是mbstate_t:
mbstate_t state = { 0 }; /* correctly zero-initialized */

和通用但不可移植的

mbstate_t state;
memset(&state, 0, sizeof state);

虽然我更喜欢并尝试使用{0}将某些东西初始化为零,但我已经使用并看到其他人使用memset版本将某些东西设置为零。我过去没有遇到过任何可移植性问题。

问题:这里使用memset真的不可移植吗?如果是这样,在什么情况下它是不可移植的?

对于浮点数和指针类型,位零不能保证为(T)0。因此,如果你将其中一个memset设置为0,你将得到最好的实现定义的东西。

这个问题列出了一些空指针不是位零的机器。

我相信Cray举了一些机器的例子,其中位零不能使你的浮点数为零。

"使用memset的目的是假设全0的位模式对应于数值0或指针值null。对于C语言的大多数实现中的大多数类型来说,这是正确的,但这不是ISO标准的要求。

以上引用来自http://www.codepolice.org/c/memset.html(这是Google第一个针对"memset的可移植性问题"的搜索)

在这里使用memset真的不可移植吗?

视情况而定。

如果是,在什么情况下它是不可移植的?

使用memset always将整数设置为零位,使整数为零。
使用memset 将浮点数设置为零位通常使数字为零,但这并不能保证——取决于浮点数如何存储
对于指针来说也是一样;位设置为0的指针不一定是NULL指针。

最新更新