我在 c 中有一个静态数组,定义如下:
typedef struct
{
int a;
int b;
int c;
int d;
} Hello;
static Hello hello[6] = {{0}};
然后在某些时候,我需要将此静态数组中每个元素的所有属性重置为 0;这该怎么做?
您需要使用memset()
:
#include <string.h>
memset(hello, 0, sizeof hello);
请注意,这仅适用,因为“所有位 0”是将int
变量设置为 0 的一个非常安全的假设。如果hello
包含例如float
s 或指针,则该假设根本不成立,您必须进行手动循环。
我不同意 unwind 对浮点数和指针的初始化“该假设根本不成立” - 它在大多数情况下都成立。
在我看来,假设全为零是非常安全的float 0
,因为您可能有 IEEE 754 浮点数。请参阅如果所有位都为 0,那么 IEEE 浮点的值是多少?
假设空指针为零是非常安全的,即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,...)
}
}
另一种方法是针对您不太可能遇到的情况进行大量手动编码。