char *tokens[100];
memset(tokens,'\0',sizeof(tokens));
tokens[n]=strtok(tempVar,",");
このコードは有効ですか? memset がメモリのランダムな場所を埋めていると思いますよね?
char *tokens[100];
memset(tokens,'\0',sizeof(tokens));
tokens[n]=strtok(tempVar,",");
このコードは有効ですか? memset がメモリのランダムな場所を埋めていると思いますよね?
これは有効ですが、一連のポインターをすべてビット 0 に設定した結果が明確に定義されていないため、あまり役に立ちません。NULLポインタが(メモリ内で)「すべてのビットがゼロ」に見えるという保証はないため、これは悪い習慣です。
いいえ、これは「ランダムな」メモリを埋めるのではなく、tokens配列が占有するメモリを正確に埋めます。
これらのポインターが指すメモリではなく、100個のポインターの配列であるトークンをクリアします。
memset ビットを次のように書き直します。
memset(tokens, 0, sizeof(tokens));
あなたがしていることは、実際には配列内のすべてのポインターにゼロを割り当てているからです。それ以外の場合、コードは有効ですが、期待どおりに動作するかどうかはわかりません。
nこれは有効なコードです (例で定義されていないことを除いて)。
memsetこのように初期化しています。tokens変数全体をゼロにしています。ランダムな場所ではありません。あなたの例でも必須ではありません。
また、はトークンのコピーを返すのではなく、strtokその要素tempVarへのポインターを変更して返すことに注意してください。tempVar範囲外になると、要素が指すメモリ位置がダングリング ポインターになり、それらtokensを逆参照すると未定義の動作が発生します。