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

时间:2014-06-26 23:29:31

标签: c memset

我最近遇到了GCC的错误,该错误会阻止使用{0}初始化某些内容。 In that bug report,报告的人说:

  

C标准库中的经典示例是mbstate_t:

mbstate_t state = { 0 }; /* correctly zero-initialized */
  

与普通但非便携式相比:

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

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

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

3 个答案:

答案 0 :(得分:8)

对于浮点和指针类型,不保证按位0为(T)0。因此,如果您memset其中一个为零,那么您将获得最佳实现定义的内容。

This question列出了一些空指针不是按位为零的机器。

我相信Cray做了几个机器的例子,其中按位零不会使你的浮点数为零。

答案 1 :(得分:1)

"为此目的使用memset假设所有零的位模式对应于数值零或指针值为null。对于C的大多数实现中的大多数类型都是如此,但这不是ISO标准的要求"。

以上引用来自http://www.codepolice.org/c/memset.html(这是Google第一次点击"与memset&#34的可移植性问题;)

答案 2 :(得分:1)

  

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

这取决于。

  

如果是这样,在什么情况下会不便携?

使用memset 始终将整数设置为零,使整数为零 使用memset 将浮点数设置为零位通常使数字为零,但这不能保证 - 它取决于浮点数的存储方式
指针的故事是一样的;