これについて質問され、基本的にargcを考え出しました...実際にはargcを持たずに
あなたの与えられた argv が、私が理解しているように、入力された各引数の関連する char 配列へのポインターの配列である場合、
argv のポインターの数を実際にカウントするにはどうすればよいですか?
C 標準では、次のように指定されています。
argv[argc] shall be a null pointer.
したがって、 をテストすることで、いつでも終了を検出できます0
。
私はここで何人かの人々に同意しません。
argv 自体は null で終了します。たとえば、次のように入力すると
$./foobar hello strawberry
あなたは得るでしょう
argv = [%p] [%p] [%p] [NULL]
| | |
| | \_"strawberry\0"
| |
| \_"hello\0"
|
\_"./foobar\0"
つまり、この種のコードは機能します。
while (*argv) {
printf("%s\n", *argv);
argv++;
}
試してみてください!
一般に、配列がまたはのような「停止」値で明確に終了しない限り、できませ0
んNULL
。これが存在する理由argc
です。ポインター自体には、それらに関連付けられている要素の長さ/カウント/数はありません。
配列へのポインターを渡すときは、必然的に要素の数も渡すか、1 つ多すぎる要素を明示的に割り当てて、配列の最後に「null」要素を追加する必要があります。
それはいけません。配列が終了した後はランダム性があり、ランダム性と実際のデータを正確に区別することはできません。
argv が提供されている場合は常に存在する argc を使用する必要があります。argv の最後の char ポインターは argv[argc-1] にあります。