50

コマンドラインパラメータが常にnullで終了するかどうか疑問に思っていますか? Google は「はい」と言っているようで、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
4

2 に答える 2

83

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

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

さらに、配列要素 atargv[argc]は null ポインターであるため、配列自体もある意味で「null 終端」です。

于 2012-06-13T17:27:31.570 に答える
4

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

于 2012-06-13T17:27:11.800 に答える