次のように定義された 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 やポインターが含まれている場合、その仮定はまったく保持されず、手動ループを実行する必要があります。
フロートとポインターの初期化について「その仮定はまったく成り立たない」ということについては、私は同意しません。ほとんどの場合、それは当てはまります。
float 0
IEEE 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,...)
}
}
別の方法は、遭遇する可能性が低い状況のための多くの手動コーディングです。