main
昨日のインタビューで、返せる質問が 1 つありましたstruct
。誰かがそれが可能かどうか教えてください。もしそうなら、なぜですか?
7 に答える
main
C でのみ値を返すことができint
ます (少なくともホストされた実装の場合)。
C 標準のセクション 5.1.2.2.1 には、「いいえ」と書かれています。
プログラムの起動時に呼び出される関数は main と呼ばれます。実装は、この関数のプロトタイプを宣言していません。これは、int の戻り型でパラメーターなしで定義されます。
int main(void) { /* ... */ }
または 2 つのパラメーター (ここでは argc および argv と呼ばれますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの;) または他の実装定義の方法で
いいえ、あなたがすることはできません
メイン関数の戻り値の型が int と互換性のある型である場合、メイン関数への最初の呼び出しからの戻りは、メイン関数によって返された値を引数として exit 関数を呼び出すことと同等です;10) } に到達するmain 関数を終了すると、値 0 が返されます。戻り値の型が int と互換性がない場合、ホスト環境に返される終了ステータスは規定されていません。
また、構造体をメインに渡すことはできないため、この構造体をバイナリ ファイルに書き込むのが最善です。何をしたいですか?
編集(@effeffe用):
#include <stdio.h>
struct st{float f;};
int main(void)
{
struct st x;
x.f = 3.14;
return x;
}
戻り値
demo.c: In function ‘main’:
demo.c:9:5: error: incompatible types when returning type ‘struct st’ but ‘int’ was expected
main はもともとオペレーティング システムのプログラム ローダーから呼び出されるため、何を返しているのか、それに対して何を行うべきなのかがわかりません。
したがって、規則は次のとおりです。整数を返します。言語やプログラムに関係なく、これはプログラムがそれを起動したシェルと通信するための共通のインターフェイスを提供します。これは、スクリプトを作成する技術者以外のユーザーが、この整数を使用してスクリプト内で決定を下せることも意味します。
求めていることを実行できる最も簡単な方法は、構造をファイルに保存することです。このようにして、構造のデータを認識しているすべてのプログラムがファイルにアクセスできます。
main
int
C/C++ でのみ返すことができます。これは、プログラムが完了したときにステータス コードを返す機能と関係があります。0
は成功を意味し、1
スルー255
は特定のエラーを意味します。プログラムは、エラーの意味を含むテキスト ファイルまたは印刷物で、プログラムが実行できなかった理由を特定できるようなマニュアルを提供します。これは、誰かがエラー チェックの作業を行い、ドキュメントを作成したことを前提としています。
冗談の答え:
いいえと言う人が多いですが、私はそう思います!(ちょっと)
int のサイズが 32 ビットであり、ポインターのサイズが 32 ビットになるように 32 ビット システムを使用していると仮定すると、ヒープ上の構造体を指す int にキャストされた 32 ビット ポインターを返すことができます。また。
次に、かなり危険なことに、オペレーティングシステムがそのメモリを別のプログラムに割り当てて使用しないことを望み、そのプログラムがそれを上書きしないことを望みます。Windows や Linux などの OS を使用している場合、メモリを解放しなくても OS がメモリを解放してくれると理解しています。(もちろん、常にメモリを解放する必要がありますが、そうしないと、汚いプログラマになります!)
私の知る限り、別のプログラムが main() によって返された場所へのポインターを宣言し、(現在はなくなった) 構造体の内容をバイト単位で読み取ることができます。
私はこれがうまくいくと思いますか?それをテストする時間です!(これはひどく間違っているかもしれませんし、多くの未定義のことが起こるかもしれません.)
この答えを真剣に受け止めないでください。それを提案すると、おそらくあなたの雇用機会を台無しにするでしょう.