以下代码1很好
#include <stdio.h> // code 1
main()
{
printf("%u",main);
}
但是这段代码2给出了分段错误。
#include <stdio.h> // code 2
main()
{
printf("%u",main());
}
我没有得到main和main()之间的区别?
答案 0 :(得分:5)
您是否编译了编译器启用的所有警告?使用gcc
表示将-Wall
参数提供给gcc
(并且-g
对于调试信息非常有用。)
首先,您的printf("%u", main)
应为printf("%p\n", main)
。 %p
打印一个指针(技术上,函数指针不是%p
所需的数据指针,实际上它们通常具有相同的大小和相似的表示),你应该用换行符{{1}结束你的格式字符串}}。这将获取\n
函数的地址,并将该地址传递给main
。
然后,您的第二个printf
正在使用recursive call向printf("%u", main())
函数获取的参数调用printf
。这个递归永远不会结束,你炸掉你的调用堆栈(即堆栈溢出),所以在Unix上得到一个main
。
谦虚地说,SIGSEGV
是 C 标准的一个非常特殊的名称,你可能不应该调用它(它被main
中的启动代码自动神奇地称为) 。在crt0.o
上递归是非常糟糕的,可能是非法的。
另见我的其他答案here。