11

一般来说,根据 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));
4

3 回答 3

15

也许值得注意的是,memset它对您的结构(或数组,或基元,或任何您碰巧释放它的内存块)一无所知,所以即使它想保持填充位完好无损,它也不会甚至知道他们在哪里。

于 2011-12-18T04:33:23.403 回答
11

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

所以如果你做 a memsetof length sizeof (your_struct),你应该没问题:

memset(&ms, 0, sizeof(struct MyStruct));
于 2011-12-18T04:27:49.587 回答
8

如果这很重要,您可能会做一些不安全且不可移植的事情。

是的,memset调用会将任何填充位(或字节)设置为 0——但语言中不能保证将float对象设置为全位为零会将其设置为 0.0。这同样适用于指针:不保证所有位为零是空指针。(在这两种情况下,大多数实现都是如此。)

最初的 ISO C90 或 C99 标准甚至不保证所有位为零是整数类型的 0 的有效表示;C99 之后的技术勘误之一添加了这样的保证(仅适用于整数类型)。

为了可移植性,如果您希望某个值为零,请明确设置它。您还可以利用静态对象的零值初始化和初始化器中省略的成员。

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

于 2011-12-18T05:31:37.140 回答