web-dev-qa-db-ja.com

メインのnullのchar * argv []引数は終了していますか?

それで、コマンドラインパラメーターが常にnullで終了するかどうか疑問に思っていますか?グーグルは「はい」と言っているようで、GCCでコンパイルするとこれが事実であることが示されますが、これが常に正しいことを保証できますか?

int main(int argc, char** argv)
{
    char *p;

    for(int cnt=1; cnt < argc; ++cnt)
    {
        p = argv[cnt];
        printf("%d = [%s]\n", cnt, p);
    }
    return 0;
}

$ MyProgram -arg1 -arg2 -arg3
1 = -arg1
2 = -arg2
3 = -arg3
43
LeviX

はい。 argv配列内の非nullポインターは、C文字列を指します。これは、定義によりnullで終了します。

C言語標準では、配列のメンバーは「文字列へのポインターを含む」(C99§5.1.2.2.1/ 2)と単純に規定されています。文字列は、「最初のヌル文字で終了し、最初のヌル文字を含む一連の文字」(C99§7.1.1/ 1)です。つまり、定義によってヌル文字で終了します。

さらに、argv[argc]の配列要素はnullポインターであるため、配列自体もある意味では「nullで終了」しています。

68
James McNellis

はい、引数がnullで終了する文字列であることは常に真です。

4
Triton Man