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意味着将-Wall参数提供给gcc(并且-g对于调试信息很有用)。

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

然后,您的第二个printf("%u", main())是使用通过对函数的递归调用printf获得的参数进行调用。这种递归永远不会结束,而且你会炸毁你的调用堆栈(即堆栈溢出),所以在 Unix 上获得一个。mainSIGSEGV

迂腐地,mainC标准的一个非常特殊的名称,您可能不应该调用它(它是由 中的启动代码自动调用的crt0.o)。递归main是非常糟糕的,可能是非法的。

另请参阅我的其他答案

于 2012-07-28T07:44:27.767 回答