以下代码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
,实际上它们通常具有相同的大小和相似的表示形式),并且您应该以换行符结束格式字符串\n
。这将获取函数的地址并将main
该地址传递给printf
.
然后,您的第二个printf("%u", main())
是使用通过对函数的递归调用printf
获得的参数进行调用。这种递归永远不会结束,而且你会炸毁你的调用堆栈(即堆栈溢出),所以在 Unix 上获得一个。main
SIGSEGV
迂腐地,main
是C标准的一个非常特殊的名称,您可能不应该调用它(它是由 中的启动代码自动调用的crt0.o
)。递归main
是非常糟糕的,可能是非法的。
另请参阅我的其他答案。