为什么 memset 不清除结构数组中的所有元素?

  • 本文关键字:元素 数组 结构 memset 清除 c
  • 更新时间 :
  • 英文 :


这是我的代码片段

typedef struct Position
{
    short X;
    short Y;
} Pos;
Pos Block[25*25+1];
void Clear_String (void)
{
    memset (&Block, 0, sizeof (Pos));
}

这是我的纯文本完整代码:点击我

为什么void Clear_String (void)不能清除结构中的所有元素?

Block和unfilled是Pos的数组。您只对传递sizeof(Pos)后的第一个项进行归零。

您最好编写:

void Clear_String (void)
{
    memset(Block,    0, sizeof(Block));
    memset(Unfilled, 0, sizeof(Unfilled));
    memset(&Erase,   0, sizeof(Erase));
    memset(&Draw,    0, sizeof(Draw));
    memset(&Predict, 0, sizeof(Predict));
    memset(&Cookie,  0, sizeof(Cookie));
  //memset(&Block,   0, sizeof(Block));  // No need to set it twice
    memset(&Move,    0, sizeof(Move));
}

请注意,您不应该传递数组的地址(所以只传递Block而不是&Block)。后者会起作用,但它不是您想要的(传递的变量的类型不同,尽管它最终被转换为void *,这并不明显)。您不需要两次将Block归零。您应该指定命名对象的大小,而不是指定命名对象类型的大小。

唯一需要注意的是,如果您是通过参数传递数组,或者如果数组是在与代码分开的文件中定义的,则将它们归零。如果声明是extern SomeType somearray[];,则不能将sizeof()应用于它。

最新更新