![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?c9bd177)
No.7ベストアンサー
- 回答日時:
普通の解説書では、「C言語のプログラムは main() から実行が始まる」と書かれています。
が、これが厳密には間違いです。実際には、(No.6 の方が書かれているフリースタンディングで*ない*環境でも)、引数の処理をして、必要なメモリ割り当てをして、その後で、「規定の形の」main() を呼び出します。
つまり、裏では、
本当のスタート()
{
// いろいろな準備
main(); // main() 関数の呼び出し
}
という雰囲気のものが動いています。
このため、ここで規定されている形以外の main() を呼ぶと、余りよくないことが起こります。
あと、「共有の拡張」として、
int main(int argc, char *argv[], char *envp[]);
を受け入れる処理系もあります。
ご回答ありがとうございます。
とてもよく分かりました。main関数自体がはじめから決まったプログラムに呼び出されているので、main関数の「main」という名前や戻り値が変えられないのですね。
No.8
- 回答日時:
JISX3010
プログラム言語C
Information technology - Programming languages - C
http://www.jisc.go.jp/app/pager?id=31196
から
5.1.2.2.1 プログラム開始処理
の部分を見て下さい。
1.. int main(void)
2.. int main(int argc , char *argv[])
3.. 2と等価な記述例えばint main(int argc, char ** argv)
4.. 以上以外の処理系定義の方法(例えば、環境変数を渡すとか、void main(void) )
となっています。
名前は、変えることができますが、main 自体初期化プログラムから呼び出されるものなので、ユーザが自由に引数を決めることはできません。
ご回答ありがとうございます。
自分はC言語の入門書しか持っていないので時々分からなくなることがあります。厳密なことを知りたい時はこういう本を読んでみます。
No.6
- 回答日時:
組み込みの話をはじめると、かなりややこしくなってくるのですが...
組み込みプログラム(家電製品とか、自動車とかのハードと一体になって動くプログラム)の場合、多くはフリースタンディング環境に属します。フリースタンディング環境というのは、OSの支援なしでプログラムが動作する環境なのですが、μITRONなどではOSがあってもフリースタンディング環境に分類されます。
フリースタンディング環境では、C言語のプログラムがどんな関数から始まるかは、関数名、引数の型と個数、返却値型のすべてが処理系定義です。
一方で、例え組み込みでも、組み込みLinuxなどを使用している場合には、フリースタンディング環境ではなく、PC等と同じホスト環境になります。この場合は、必ずmainで始まります。
要は、質問者さんが「組み込み」とか「マイコン」とかいわれる分野で仕事をされているのか、そうでないのかによって、回答も変わってくるわけです。
というわけで、どちらなのでしょうか?
No.5
- 回答日時:
確かに「自作関数」ですが「自作」して良いのは「入口と出口を除く、関数の中身だけ」です。
ですので、仕様通りの決められた引数(実行環境によって異なる場合がある)を受け取り、仕様通りの決められた返り値(実行環境によって異なる場合がある)を返さなければなりません。
「実行環境によって異なる」と言うのは、例えば
・組み込み系OSの場合、実行プログラムに対して「コマンドライン」とか「パラメータ」を渡さないので、main関数への引数がないか、あっても内容が常に固定
・第3引数に「環境変数」への文字列配列を渡して来る処理系がある
・組み込み系OSなど返り値が不要な処理系や、返り値がintではなくshort型やlong型など他の型を要求している処理系がある
などです。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?c9bd177)
No.2
- 回答日時:
>main関数は自作関数ですよね。
根拠は?何をもって『自作』?
>int main(int argc , char *argv[])
>以外の引数を決めることは出来るのでしょうか。
引数はvoidでも可。
ご回答ありがとうございます。
>根拠は?何をもって『自作』?
えっとこれは、関数というのはライブラリに定義されている関数と自分で作る関数があると聞きました。それで、main関数は後者の形式を取っているので自作関数だと判断したということです。
ということは、main関数はライブラリ関数でもなければ、自作関数でもない特殊な関数だと理解すればいいですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像の拡大・縮小
-
processingのプログラムの書き...
-
カードシャッフルのブログラム...
-
C言語で簡単なパックマンゲーム...
-
intとlongは同じ?
-
迷路を脱出する経路探索プログ...
-
ヒストグラム均等化処理プログラム
-
再起呼び出しの回数をカウント...
-
c++でテンプレートのコードでわ...
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
O(n log n)について2
-
度数分布表の階級の端の値
-
中学生で数学です。 √84nが自然...
-
C++プログラミングコードにポリ...
-
10個出力で改行したいのですが...
-
float型とdouble型の変数の違い...
-
Aの値からBの値を除するとは??
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
intとlongは同じ?
-
C言語で%を使わない余りの出し方
-
2の補数を計算するプログラム
-
再起呼び出しの回数をカウント...
-
画像の拡大・縮小
-
迷路を脱出する経路探索プログ...
-
分数の足し算をさせるプログラ...
-
OpenCVによる4値化について
-
3のつく数と3の倍数を表示 C言語
-
C言語で簡単なパックマンゲーム...
-
ヌメロンのプログラム
-
C++で表を作成したいのです ...
-
複数の共有メモリの作成
-
カードシャッフルのブログラム...
-
whileとifを使い偶数を出すには
-
関数とビット列
-
【C#】SQL文の中に変数を埋め込...
-
異なるn個の整数からr個の整数...
-
c言語プログラミングについて f...
-
条件が多い場合
おすすめ情報