0

次のコード 1 は問題ありません

#include <stdio.h>    // code 1
main()
{
    printf("%u",main);
}

しかし、このコード 2 ではセグメンテーション違反が発生します。

#include <stdio.h>  // code 2
main()
{
    printf("%u",main());
}

main と main() の違いがわかりません。

4

1 に答える 1

5

コンパイラからすべての警告を有効にしてコンパイルしましたか? これは、に引数をgcc与えることを意味します(情報のデバッグに役立ちます)。-Wallgcc-g

まず、あなたのprintf("%u", main)はずですprintf("%p\n", main)。は%pポインターを出力します (技術的には、関数ポインターは に必要なデータ ポインターではありません%p。実際には、多くの場合、同じサイズで同様の表現になります)。フォーマット文字列は newline で終了する必要があります\n。これは関数のアドレスを取得mainし、そのアドレスを に渡しますprintf

次に、2番目printf("%u", main())は、関数の再帰呼び出しprintfによって取得された引数を使用して呼び出しています。この再帰は決して終わらず、コール スタックを爆発させます (つまり、スタック オーバーフローが発生します)。そのため、Unix を取得します。mainSIGSEGV

は、Cmain標準の非常に特殊な名前であり、おそらくそれを呼び出すべきではありません (これは、 のスタートアップ コードによって自動的に呼び出されます)。再帰は非常に悪趣味であり、違法である可能性があります。crt0.omain

ここで私の他の回答も参照してください。

于 2012-07-28T07:44:27.767 に答える