1

私はchar *words[]それがさまざまな長さの弦を保持している。

動的wordsに割り当てられた5つの文字列を含めます["zero","one","two","three","four"]

文字列の1つを解放し、そのポインタをNULL次のように設定します。

free(words[1]);
*(words[1]) = NULL;

後で、words配列をループして、各項目がNULL次のようになっているかどうかを確認します。

if(*words[i] == NULL)

そして、私がコンパイルすると、gccは言いwarning: comparison between pointer and integerます。少しグーグルすると、チェックを次のように変更することで、この警告を消すことができることがわかりました。

if(*words[i] == 0)またif(*words[i])

私はその気まぐれなことを知っていますが、これらのチェックは、それが使用された場合ほど明確ではありませんNULLNULLgccフラグを変更せずに使用したり、#define-esqueソリューションを使用したりして比較する方法はありますか?


参考までに、私のコンパイルコマンドは次のとおりです。

gcc -m32 -g -O0 -std=gnu99 -Wall -Wfloat-equal -Wtype-limits -Wpointer-arith -Wlogical-op -fno-diagnostics-show-option  -m32  words.c   -o words
4

1 に答える 1

7

コードはあなたが思っていることをしていません。i番目の文字列自体(つまり*words[i]a)ではなく、i番目の文字列(つまりa)の最初の文字を示します。あなたが欲しいのはただです。Cでは基本的にです。charchar*words[i]char* words[]char** words

char警告は、Cが整数であると見なすという事実から来ています。この場合、コンパイラが警告するのは良いことです。

于 2013-01-21T03:24:16.367 に答える