struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
私はこの構造体を埋めて、値を使用しています。次の繰り返しで、私はにすべてのフィールドをリセットしたい0
かnull
、私はそれを再利用を開始する前に。
どうやってやるの?使用できますmemset
か、それともすべてのメンバーを通過してから個別に実行する必要がありますか?
回答:
初期値で構造体のconst staticインスタンスを定義し、リセットしたいときはいつでもこの値を変数に割り当てるだけです。
例えば:
static const struct x EmptyStruct;
ここでは静的初期化を使用して初期値を設定していますが、異なる初期値が必要な場合はstruct初期化子を使用できます。
次に、ループを回るたびに次のように記述できます。
myStructVariable = EmptyStruct;
memset
と汚れてきます。可能な限り、メモリレイアウトをコンパイラに任せたいと思います。厳密に言えば、そのような使用はmemset
移植性がありませんが、実際に重要な場所でコードをコンパイルしたことがあれば、私は驚かれるでしょう。したがって、必要に応じてmemsetを安全に使用できます。
最新のC(C99)を使用している場合にこのようなことを行う方法は、複合リテラルを使用することです。
a = (const struct x){ 0 };
これは、Davidのソリューションにいくぶん似ていますが、空の構造を宣言したり、それを宣言するかどうかを心配したりする必要はありませんstatic
。私が使用したconst
ようにを使用する場合、コンパイラーは、必要に応じて複合リテラルを読み取り専用ストレージに静的に割り当てることができます。
{ 0 }
し、デフォルトの初期化子としてを予測しています。その警告をオフに切り替えてください、それは偽の誤警報です。
上記のすべてよりも優れているのは、構造体の初期化に標準C仕様を使用することです。
struct StructType structVar = {0};
ここにすべてのビットがゼロになります。
{0}
か{}
。C&C ++標準が明確でこの問題について同期しているかどうかはわかりませんが、コンパイラはそうではないようです。
struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
Cでは、struct
usingのメモリをゼロにするのが一般的な慣用法memset
です。
struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));
厳密に言えば、NULL
マシン上のポインターが整数値0で表されると想定しているため、これは移植可能だとは思わないが、ほとんどのマシンでこれが当てはまるため、広く使用されている。
CからC ++に移行する場合は、すべてのオブジェクトでこの手法を使用しないように注意してください。C ++は、メンバー関数も継承もないオブジェクトに対してのみこれを正当にします。
C99準拠のコンパイラを使用している場合は、
mystruct = (struct x){0};
それ以外の場合は、David Heffernanが書いたことを行う必要があります。つまり、次のように宣言します。
struct x empty = {0};
そしてループで:
mystruct = empty;
memset
構造体のサイズで使用できます:
struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
memset
はオプションですが、それを使用するときは、書き込まれるメモリが3番目のパラメータと正確に同じサイズであることを確認する必要があります。そのため、実際のオブジェクトのサイズではなく、実際のオブジェクトのサイズを参照することをお勧めしますそれが現在あることを知っています。IOWの方memset (&x_instance, 0, sizeof(x_instance));
がはるかに良い選択です。ところで:(void*)
キャストはC ++でも不必要です。
struct x myX;
...
memset(&x, 0, sizeof(myX));
ここに画像の説明を入力してください。
typedef struct {
uint8_t messType;
uint8_t ax; //axis
uint32_t position;
uint32_t velocity;
}TgotoData;
TgotoData tmpData = { 0 };
何もゼロではありません。
memset
すべてをリセットしたいだけの場合に使用するよりも良いです0
か?