我最近遇到了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
真的不可移植吗?如果是这样,在什么情况下它是不可移植的?
答案 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
将浮点数设置为零位通常使数字为零,但这不能保证 - 它取决于浮点数的存储方式 。
指针的故事是一样的; 1}}指针不需要将其位设置为零的指针。