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たとえばfloat、s やポインターが含まれている場合、その仮定はまったく保持されず、手動ループを実行する必要があります。

于 2012-11-19T09:37:42.400 に答える
0

フロートとポインターの初期化について「その仮定はまったく成り立たない」ということについては、私は同意しません。ほとんどの場合、それは当てはまります。

float 0IEEE 754フロートを使用している可能性が高いため、私の意見ではすべてゼロであると想定するのはかなり安全です。すべてのビットが0の場合、IEEE浮動小数点の値は何ですか?を参照してください。

そして、nullポインタがゼロであると仮定するのはかなり安全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 に答える