C 为什么';t memset是否清除结构数组中的所有元素?

C 为什么';t memset是否清除结构数组中的所有元素?,c,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\u String(void)无法清除结构中的所有元素?Block和unfilled是Pos数组。自从通过sizeof(P

这是我的代码片段

typedef struct Position
{
    short X;
    short Y;
} Pos;

Pos Block[25*25+1];

void Clear_String (void)
{
    memset (&Block, 0, sizeof (Pos));
}
以下是我的纯文本完整代码:


为什么
void Clear\u 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*
,这并不明显)。您不需要两次归零
。您应该指定命名对象的大小,而不是命名对象类型的大小


唯一需要注意的是,如果您是按参数传递数组,或者如果数组是在与代码不同的文件中定义的,则将其置零。如果声明是
extern SomeType somearray[],您不能对其应用
sizeof()

元素是无、部分还是全部?您在
中得到了错误的元素大小——这是唯一的一个吗?请更具体一些。此代码片段中有八个结构。哪个是未被清除的?哪些成员没有被清除?我们不是通灵者。@Raymond Chen噢,对不起,只有
未填充[]
块[]
未被清除。通过从代码中删除不相关的结构,您可以节省每个人很多时间。@Raymond Chen Yep,我删除了不相关的代码。现在看起来更简洁了。顺便说一句,我已经完成了我的snake::-)那么,这是否正确:
memset(&Block,0,sizeof(Pos)*(25*25+1))?最好参考变量本身sizeof(块)。如果将来更改项目的数量也会更安全。@KVD:
memset(&Block,0,sizeof(Block))
更简单,更不容易出错。太好了!谢谢你的回答。非常清楚。谢谢