次のコード 1 は問題ありません
#include <stdio.h> // code 1
main()
{
printf("%u",main);
}
しかし、このコード 2 ではセグメンテーション違反が発生します。
#include <stdio.h> // code 2
main()
{
printf("%u",main());
}
main と main() の違いがわかりません。
次のコード 1 は問題ありません
#include <stdio.h> // code 1
main()
{
printf("%u",main);
}
しかし、このコード 2 ではセグメンテーション違反が発生します。
#include <stdio.h> // code 2
main()
{
printf("%u",main());
}
main と main() の違いがわかりません。
コンパイラからすべての警告を有効にしてコンパイルしましたか? これは、に引数をgcc
与えることを意味します(情報のデバッグに役立ちます)。-Wall
gcc
-g
まず、あなたのprintf("%u", main)
はずですprintf("%p\n", main)
。は%p
ポインターを出力します (技術的には、関数ポインターは に必要なデータ ポインターではありません%p
。実際には、多くの場合、同じサイズで同様の表現になります)。フォーマット文字列は newline で終了する必要があります\n
。これは関数のアドレスを取得main
し、そのアドレスを に渡しますprintf
。
次に、2番目printf("%u", main())
は、関数の再帰呼び出しprintf
によって取得された引数を使用して呼び出しています。この再帰は決して終わらず、コール スタックを爆発させます (つまり、スタック オーバーフローが発生します)。そのため、Unix を取得します。main
SIGSEGV
は、Cmain
標準の非常に特殊な名前であり、おそらくそれを呼び出すべきではありません (これは、 のスタートアップ コードによって自動的に呼び出されます)。再帰は非常に悪趣味であり、違法である可能性があります。crt0.o
main
ここで私の他の回答も参照してください。