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

Cor*_*lks 4 c memset

我最近遇到了GCC的错误,无法用一些东西来初始化{0}.在该错误报告中,报告它的人说:

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

mbstate_t state = { 0 }; /* correctly zero-initialized */
Run Code Online (Sandbox Code Playgroud)

与常见但不可移植的:

mbstate_t state;
memset(&state, 0, sizeof state);
Run Code Online (Sandbox Code Playgroud)

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

问题:memset在这里使用真的不便携吗?如果是这样,在什么情况下会不便携?

tmy*_*ebu 8

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

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

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

  • @Cornstalks:你误解了标准.该标准要求积分常数0在转换为指针类型时产生空指针.它不要求空指针由按位零表示.另见http://c-faq.com/null/machnon0.html. (6认同)
  • `memset`初始化适用于"float和double类型,但仅当实现已定义宏__STDC_IEC_559__以声明它符合IEC 60559浮点运算附件"时 (3认同)