1

我在 c 中有一个静态数组,定义如下:

typedef struct
{
int a;
int b;
int c;
int d;
} Hello;

static Hello hello[6] = {{0}}; 

然后在某些时候,我需要将此静态数组中每个元素的所有属性重置为 0;这该怎么做?

4

2 回答 2

6

您需要使用memset()

#include <string.h>
memset(hello, 0, sizeof hello);

请注意,这仅适用,因为“所有位 0”是将int变量设置为 0 的一个非常安全的假设。如果hello包含例如floats 或指针,则该假设根本不成立,您必须进行手动循环。

于 2012-11-19T09:37:42.400 回答
0

我不同意 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,...)
    }
}

另一种方法是针对您不太可能遇到的情况进行大量手动编码。

于 2012-11-19T12:26:23.687 回答