这是我的代码片段
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()
应用于它。