2

使用するときは常にmemsetゼロに設定します。

なんで?1 か 2 か何かではないでしょうか。

また、構造体を 0 に設定すると機能するように見えますが、1 に設定すると機能しません。

typedef struct abc{
    int a;
} abc;

int main()
{
    abc* ab;
    memset(ab, 0, sizeof(abc));// it sets abc->a = 0; correct
}

しかし、次の0ように使用する代わりに1:

memset(ab, 1, sizeof(abc));

abc->a = garbageまたはの値not equals to 1

なんで?

4

5 に答える 5

13

常に 0 にする必要はありませんmemset。これは、最も一般的な (そして便利な) ことです。

memsetバイトを特定の値に設定します。Anintは 4 バイトで構成されているため、 にmemseting する場合1、これらの 4 つをそれぞれ に設定すると、 2 = 101になります(最初の数字は 2 進数、最後の数字は 10 進数)。00000001 | 00000001 | 00000001 | 0000000116843009

また、メモリを決して割り当てないことに注意してくださいab。コードが動作するようになったとしても、安全ではありません。これは:

abc ab;
memset(&ab, 0, sizeof(abc));
于 2013-02-22T07:07:36.360 に答える
4

他の人が述べたように、0ほとんど恣意的です。ただし、理由を選択する必要がある場合は、便宜上です (安全性を犠牲にして - 変数に依存する場合は、変数を明示的に初期化することをお勧めします)。

  • 0 は、幅やエンディアンに関係なく 0 を表すため、ほとんどの場合、符号付きまたは符号なしの整数の初期値として理解されます。
  • 0 はchar*s の文字列の終わりです
  • 浮動小数点数の場合、0 は多くの場合 0.0 です。
  • 0 は C にあることが多く、 C++NULLにあることが保証されていますNULL
于 2013-02-22T07:12:18.730 に答える
2

memset()メモリを設定するために使用する値は、ニーズによって異なります。それで全部です。他の値を使用してメモリを初期化することを誰も妨げません。

于 2013-02-22T07:07:53.920 に答える
1

最初に、プログラムは未定義の動作を取得しました。原因は abc* ab のメモリです。割り当てられることはありません。

次に、文字列は「null」で終了する必要があります。これは、文字列が最後であることを意味します。これに触発されて、memset で null を使用します。ただし、任意の値を使用できます...

于 2013-02-22T07:09:20.363 に答える
1

プログラムに示されているように、変数が定義されている場合、デフォルトでは任意の場所を指し、ジャンクデータは以前はそこにあった可能性があります。

通常、memset を (0)zero に設定して、変数が確実にゼロに初期化されるようにします。これにより、プログラムの後半で、変数に割り当てられた値が真に割り当てられた値であり、ゴミではないと信頼できます。

それが役に立てば幸い.....

于 2013-02-22T07:01:44.173 に答える