一般来说,根据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));
Run Code Online (Sandbox Code Playgroud)
jma*_*man 11
是的,memset将32位值写入从给定地址开始的给定长度的连续内存区域.在您的情况下,memset使用(32位值)写入区域0.
所以,如果你做了一个memset长度sizeof (your_struct),你应该没事:
memset(&ms, 0, sizeof(struct MyStruct));
Run Code Online (Sandbox Code Playgroud)
如果重要的话,你可能会做一些不安全和不便携的事情.
是的,该memset调用将任何填充位(或字节)设置为0 - 但是在语言中无法保证将float对象设置为all-bits-zero将其设置为0.0.这同样适用于指针:all-bits-zero不保证是空指针.(在这两种情况下,对于大多数实现来说都是如此.)
原始的ISO C90或C99标准甚至不保证all-bits-zero对于整数类型是0的有效表示; 其中一个后C99技术勘误表添加了这样的保证(仅适用于整数类型).
为了便于携带,如果您想要某些东西为零,请明确设置它.您还可以利用静态对象的零值初始化和初始化程序中的省略成员.
术语挑剔:"填充位"是整数类型表示的一部分(通常没有它们).struct成员之间的填充是填充字节.
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |