通常,根据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));
答案 0 :(得分:15)
也许值得注意的是memset
对你的结构(或数组,或原语,或任何你发生的任何内存块)一无所知,所以即使它想要离开填充位完好无损,甚至不知道它们在哪里。
答案 1 :(得分:11)
是的,memset
将32位值写入从给定地址开始的给定长度的连续内存区域。在您的情况下,memset使用(32位值)0
写入区域。
因此,如果您执行memset
长sizeof (your_struct)
,那么您应该没问题:
memset(&ms, 0, sizeof(struct MyStruct));
答案 2 :(得分:8)
如果重要,你可能会做一些不安全和不便携的事情。
是的,memset
调用会将任何填充位(或字节)设置为0 - 但是在语言中无法保证将float
对象设置为all-bits-zero将设置它到0.0。这同样适用于指针:all-bits-zero不保证是空指针。 (在这两种情况下,对于大多数实现来说都是如此。)
原始的ISO C90或C99标准甚至不保证all-bits-zero对于整数类型是0的有效表示;其中一个后C99技术勘误表增加了这样的保证(仅适用于整数类型)。
为了便于携带,如果您希望某些内容为零,请明确设置它。您还可以利用静态对象的零值初始化和初始化器中的省略成员。
术语挑剔:“填充位”是整数类型表示的一部分(通常没有它们)。 struct成员之间的填充是填充 bytes 。