0
char *tokens[100];  

memset(tokens,'\0',sizeof(tokens));  

tokens[n]=strtok(tempVar,",");

このコードは有効ですか? memset がメモリのランダムな場所を埋めていると思いますよね?

4

4 に答える 4

3

これは有効ですが、一連のポインターをすべてビット 0 に設定した結果が明確に定義されていないため、あまり役に立ちません。NULLポインタが(メモリ内で)「すべてのビットがゼロ」に見えるという保証はないため、これは悪い習慣です。

いいえ、これは「ランダムな」メモリを埋めるのではなく、tokens配列が占有するメモリを正確に埋めます。

于 2013-01-08T16:05:26.057 に答える
2

これらのポインターが指すメモリではなく、100個のポインターの配列であるトークンをクリアします。

于 2013-01-08T16:05:05.210 に答える
1

memset ビットを次のように書き直します。

memset(tokens, 0, sizeof(tokens));  

あなたがしていることは、実際には配列内のすべてのポインターにゼロを割り当てているからです。それ以外の場合、コードは有効ですが、期待どおりに動作するかどうかはわかりません。

于 2013-01-08T16:05:33.647 に答える
1

nこれは有効なコードです (例で定義されていないことを除いて)。

memsetこのよう初期化しています。tokens変数全体をゼロにしています。ランダムな場所ではありません。あなたの例でも必須ではありません。

また、はトークンのコピーを返すのではなく、strtokその要素tempVarへのポインターを変更して返すことに注意してください。tempVar範囲外になると、要素が指すメモリ位置がダングリング ポインターになり、それらtokensを逆参照すると未定義の動作が発生します。

于 2013-01-08T16:05:47.487 に答える