【发布时间】:2012-01-22 21:40:34
【问题描述】:
一般来说,根据 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));
【问题讨论】:
-
你能给我们看一个代码示例吗?
-
我不明白是什么让你怀疑。
-
那么简短的回答:是的。它会将
ms占用的整个内存区域归零。填充位和所有... -
@MK,我在某处看到了一条评论“即使您在使用它们之前已经对这些结构进行了 memset,也不要 memcmp 结构”。我的想法是,如果填充位已经 memset 为 0,那么以后使用 memcmp 不会有任何问题。可能是我发现的参考是错误的。
-
我认为这可能是一个好主意,通常不要依赖 memcmp 来比较你的结构,因为如果你忘记在哪里忘记 memset,你手上就会有一个很难找到的错误。因此,除非已经证明它是性能瓶颈,否则请编写显式比较函数。还可以想象这样一种情况,您有一个 char buf[20],在一个结构中设置为“aaa”,在另一个结构中设置为“bbb”,然后将两者都设置为“c”。现在这些结构在逻辑上是相等的,但 memcmp 会认为它们是不同的。