LoginSignup
36
17

More than 3 years have passed since last update.

C言語 main(int argc, char const *argv[])について

Last updated at Posted at 2020-06-23

main関数

プログラムの指示された開始点。

main関数は以下のように定義される。

int main (void) { body }

int main (int argc, char *argv[]) { body }

int argc, char *argv[]の部分はコマンドライン引数という。

*argv[]**argvとも表現できる。ダブルポインタ。

参考: main 関数 - cppreference.com

コマンドライン引数とは

コマンドライン引数とは、コンピュータのコマンド入力画面(コマンドライン)からプログラムを起動する際に指定する文字列のこと。また、これをプログラム側で受け取った変数などの値。

参考: コマンドライン引数とは - IT用語辞典 e-Words

main関数の引数はコマンドイラン引数と言われます。
コマンドライン引数は、プログラム実行時にOSに環境変数とともに指定するパラメータの1つです。

int main(int argc, char const *argv[])

argc, argvがコマンドライン引数。実行コマンドを取得する。

$ ./a.out 100 abc

を実行すると中身は以下のようになる。

argc=3; // コマンドライン引数の数
argv[0]="./a.out";
argv[1]="100";
argv[2]="abc";
  • argv[0]には必ずパスを含めたファイル名が入る。
    • 厳密に言うと、argv[0] がヌルでない場合、または argc > 0 である場合 (両者は同等です)、 argv[0] はプログラムの名前を表す文字列を指します。
  • 文字列として格納される。

がポイント

参考: コマンドライン引数
参考: Argument definition by The Linux Information Project (LINFO)

argc、argvとは

  • argc
    • "argument count"(引数の個数)の略
  • argv
    • "argument vector"(引数の配列)の略

引数文字列の"配列へのポインタ"のことを指している。
あくまで、初めに用意されている言葉なので、他の関数同様に型さえ一緒であれば、int main(int a, char const *b[])や、int main(int a, char const **b)でも有効。

参考: argc,argvとは? - Qiita

いつも打っているコマンドってプログラムにコマンドライン引数を渡して実行しているってことか!

これで理解できました。コマンドって実行ファイルに引数を渡したりして、実行させている。

mkdir -p tests/test{1..5} && touch test/test1/file{3..5}.txt

とかも、実行ファイルに、コマンドイラン引数を使ってやり取りしているだけだった。コマンドは自分でも作れるということ。

参考: C言語-コマンドの作成-コマンドラインとオプションの取得

コードランナーとか使って自動的にcompile、実行とかしていて、この辺理解しないで進めていたので、ハッとしました。

おまけ1

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

int main(int argc, char *argv[])
{
    printf("argv[0]: %s\n", argv[0]);
    printf("sizeof(argv[0]): %zu\n", sizeof(argv[0]));
    printf("strlen(argv[0]): %zu\n", strlen(argv[0]));

    return 0;
}

実行結果

./filepath/filename
sizeof(argv[0]): 8
strlen(argv[0]): 46
  • argv[n]は文字列ではなく、文字列を示すポインタを格納している
    • char str[] = "filename";のstrではなく、&strであるということ
    • ポインタであるため、sizeof(argv)は8byteになる。
  • strlenは指定されたアドレスからヌル終端文字までを取る。sizeof演算子との違いが改めて理解できた。

おまけ2

環境変数が第3引数として渡される環境もある。その場合、以下のコードで参照することができる。

#include <stdio.h>

int main(int argc, char** argv, char** envp)
{
    for(int i = 0; envp[i]; i++)
        puts(envp[i]);
}
36
17
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
17