コマンドライン引数とsizeof()とstrlenと

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i;
    char *ch = "Hello";
    char ar[] = "Hello";


    if ( 2 != argc ) {
        fprintf(stderr, "引数が足りません\n");
        exit(-1);
    }


    printf("argv[1]: %s\n", argv[1]);
    printf("sizeof(argv[1]): %d\n", sizeof(argv[1]));
    printf("strlen(argv[1]): %d\n", strlen(argv[1]));

    for ( i = 0; i < sizeof(argv[1]); ++i )
        if ( '\0' == argv[1][i] )
            printf("argv[1][%d]に'\\0'を発見しました.\n", i);

    puts("");


    printf("ch: %s\n", ch);
    printf("sizeof(ch): %d\n", sizeof(ch));
    printf("strlen(ch): %d\n", strlen(ch));

    for ( i = 0; i < sizeof(ch); ++i )
        if ( '\0' == ch[i] )
            printf("ch[%d]に'\\0'を発見しました.\n", i);

    puts("");


    printf("ar[]: %s\n", ar);
    printf("sizeof(ar): %d\n", sizeof(ar));
    printf("strlen(ar): %d\n", strlen(ar));

    for ( i = 0; i < sizeof(ar); ++i )
        if ( '\0' == ar[i] )
            printf("ar[%d]に'\\0'を発見しました.\n", i);

    puts("");


    return 0;
}
  • 入力
./a.out Hello
  • 出力
argv[1]: Hello
sizeof(argv[1]): 4
strlen(argv[1]): 5

ch: Hello
sizeof(ch): 4
strlen(ch): 5

ar[]: Hello
sizeof(ar): 6
strlen(ar): 5
ar[5]に'\0'を発見しました.
  • 結論

コマンドライン引数は文字リテラルになっている
・文字リテラルはナル文字がない
・文字リテラルはポインタで指されているため,sizeof()は4byte
・strlenは文字数なので文字リテラルでも配列でも変わらない(ただし,返却値にナル文字を含まない)