我在c中有一个静态数组,如下所示:
typedef struct
{
int a;
int b;
int c;
int d;
} Hello;
static Hello hello[6] = {{0}};
然后在某些时候我需要将这个静态数组中每个元素的所有属性重置为0;怎么做?
答案 0 :(得分:6)
您需要使用memset()
:
#include <string.h>
memset(hello, 0, sizeof hello);
请注意,这仅适用,因为“所有位0”是将int
变量设置为0的非常安全的假设。如果hello
包含例如float
{{1}}或指针,这个假设根本不存在,你必须做一个手动循环。
答案 1 :(得分:0)
我不同意在浮动和指针的启动上放松“这种假设根本不存在” - 大部分时间它都存在。
我认为float 0
全部为零是非常安全的,因为你可能有IEEE 754浮点数。见If all bits are 0, what is the value of IEEE floating point?
假设空指针为零即NULL == 0
,这是非常安全的。虽然也不能保证。
如果您想确定这些假设并证明在您的环境中memset
是安全的,那么我建议如下:
void testFloatAssumptions()
{
const float fzero=0;
float f;
memset(&f,0,sizeof(f));
if(memcmp(&f,&fzero,sizeof(f))!=0)
{
//then you have a float problem w.r.t. memset(...,0,...)
}
}
void testPointerAssumptions()
{
const int* nullPointer=NULL;
int* pointer;
memset(&pointer,0,sizeof(pointer));
if(memcmp(&pointer,&nullPointer,sizeof(pointer))!=0)
{
//then you have a pointer problem w.r.t. memset(...,0,...)
}
}
替代方案是针对您不太可能遇到的情况进行大量手动编码。