c/c++语言开发共享是否保证memset会将结构中的填充位清零?

一般来说,根据C标准,保证带有0的memset()会将C结构中的填充位清零吗?

那gcc怎么样?

例如,类似于:

struct MyStruct { unsigned char member1; unsigned int member2; char member3; unsigned char member4; float member5; }; struct MyStruct ms; memset(&ms, 0, sizeof( struct MyStruct)); 

    也许值得注意的是, memset对你的struct(或者数组,或者是原始的,或者你碰巧释放它的任何内存块)一无所知,所以即使它想要保持填充位完整,它也不会甚至不知道他们在哪里。

    是的, memset将32位值写入从给定地址开始的给定长度的连续内存区域。 在您的情况下,memset写入区域(32位值) 0

    所以如果你做一个长度sizeof (your_struct)memset ,你应该没问题:

     memset(&ms, 0, sizeof(struct MyStruct)); 

    如果重要的话,你可能会做一些不安全和不便携的事情。

    是的, memset调用会将任何填充位(或字节)设置为0 – 但是在语言中无法保证将float对象设置为all-bits-zero会将其设置为0.0。 这同样适用于指针:all-bits-zero不保证是空指针。 (在这两种情况下,对于大多数实现来说都是如此。)

    原始的ISO C90或C99标准甚至不保证all-bits-zero对于整数类型是0的有效表示; 其中一个后C99技术勘误表添加了这样的保证(仅适用于整数类型)。

    为了便于携带,如果您想要某些东西为零,请明确设置它。 您还可以利用静态对象的零值初始化和初始化程序中的省略成员。

    术语挑剔:“填充位”是整数类型表示的一部分(通常没有它们)。 struct成员之间的填充是填充字节

      以上就是c/c++开发分享是否保证memset会将结构中的填充位清零?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562732.html

      (0)
      上一篇 2021年2月5日
      下一篇 2021年2月5日

      精彩推荐