main和main之间的区别()

时间:2012-07-28 07:37:46

标签: c segmentation-fault

以下代码1很好

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

但是这段代码2给出了分段错误。

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

我没有得到main和main()之间的区别?

1 个答案:

答案 0 :(得分:5)

您是否编译了编译器启用的所有警告?使用gcc表示将-Wall参数提供给gcc(并且-g对于调试信息非常有用。)

首先,您的printf("%u", main)应为printf("%p\n", main)%p打印一个指针(技术上,函数指针不是%p所需的数据指针,实际上它们通常具有相同的大小和相似的表示),你应该用换行符{{1}结束你的格式字符串}}。这将获取\n函数的地址,并将该地址传递给main

然后,您的第二个printf正在使用recursive callprintf("%u", main())函数获取的参数调用printf。这个递归永远不会结束,你炸掉你的调用堆栈(即堆栈溢出),所以在Unix上得到一个main

谦虚地说,SIGSEGV C 标准的一个非常特殊的名称,你可能不应该调用它(它被main中的启动代码自动神奇地称为) 。在crt0.o上递归是非常糟糕的,可能是非法的。

另见我的其他答案here