C++ 当我试着调用main时,它工作了好几次,但后来我遇到了分段错误

C++ 当我试着调用main时,它工作了好几次,但后来我遇到了分段错误,c++,C++,为什么我会看到分割错误? 代码: #包括 int main() { 出售(“工作”); main(); } [] []实际发生的似乎是真实的。你有一个递归函数,它会进入无限递归,所以在某个时候它会出栈。 < P> C++标准3.61/3不允许你调用主()在主()/p> 主功能不得在程序中使用(3.2)。主要实现的链接(3.5)已定义。将main声明为内联或静态的程序是错误的。名称main不是以其他方式保留的。[示例:成员函数、类和枚举可以被称为main,其他名称空间中的实体也可以被称为main

为什么我会看到分割错误? 代码:

#包括
int main()
{
出售(“工作”);
main();
}
[]
[]

实际发生的似乎是真实的。你有一个递归函数,它会进入无限递归,所以在某个时候它会出栈。

< P> C++标准3.61/3不允许你调用主()在主()/p> 主功能不得在程序中使用(3.2)。主要实现的链接(3.5)已定义。将main声明为内联或静态的程序是错误的。名称main不是以其他方式保留的。[示例:成员函数、类和枚举可以被称为main,其他名称空间中的实体也可以被称为main。]

最终会出现堆栈溢出。(实际上,在main内部调用main是一种未定义的行为)

所使用的(3.2)说明:

如果对象或非重载函数的名称出现在 潜在的计算表达式

还可以看到:

5.2.2.9
允许递归调用,名为main的函数除外


首先,由于存在无休止的递归,最终会出现堆栈溢出。你认为会发生什么

第二,标准C++不允许你调用<代码>主< /代码>。您的代码无效,编译器这样做是合理的(而且是明智的)。

更好的问题是,您希望这段代码会发生什么


您有一个无限递归函数,它不断地添加到标准输出流中。当然,您会遇到一个错误——您不断地将“工作”字符串分配到堆栈中,这将导致溢出。我不确定当您将太多数据推入标准输出流时会发生这种情况,但这也不健康

只需添加一些实用信息:

这是您将得到的警告:

gcc-壁面试验

警告:控件到达非无效函数的末尾[-Wreturn类型]

它没有说任何关于main的内容(我希望它能显示一些东西)

这是在gdb中运行应用程序的回溯:

gdb./a.out

程序接收信号SIGSEGV,分段故障。0x00007FF7A8DFFE在fileops.c:12611261 fileops.c:没有这样的文件或目录中写入新文件(f=0x7ffff7dd4400,数据=0x7FF7FF7000,n=5)。(gdb)英国电信
#0 0x00007FF7A8DFFE在文件操作中写入新文件(f=0x7ffff7dd4400,数据=0x7ffff7ff7000,n=5)。c:1261
#1 0x00007FF7A8F4DC在fileops.c:538处的新写入(to_do=5,data=0x7ffff7ff7000“WORK\n”,fp=0x7FF7DD4400)
#2.新的写操作(fp)=fp@entry=0x7ffff7dd4400,数据=0x7ffff7ff7000“工作\n”,to_do=5)在fileops.c:511
#3 0x00007FF7A8F8B3在文件操作处的新文件溢出(f=0x7ffff7dd4400,ch=10)中。c:876
#ioputs处的4个0x00007ffff7a84f72输入输出(str=0x4005d4“工作”)。c:42
#5 0x000000000040053b在主()

你是如何运行这个程序的?在用g++编译之后,我直接启动它,那么为什么
main
会运行很多次呢?这是完整的代码吗?是的,这是完整的代码。我认为标准不允许你自己调用main。我将尝试验证这一点。啊,你比我快:)添加到这一点上--离开main是编译器销毁所有静态初始化对象的提示。如果您多次进出主管道,会发生什么情况?它可能会变得非常混乱,这取决于我认为的实现;语句很少出现,正如我在截屏中提到的,因为编译器可以接受无效的程序。然而,好的编译器会尽其所能为您提供有关任何问题的提示,通常是警告。
#include<stdio.h>
 int main()
 {
  puts("WORK");
  main();
 }
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a8dffe in _IO_new_file_write (f=0x7ffff7dd4400 <_IO_2_1_stdout_>, data=0x7ffff7ff7000, n=5) at fileops.c:1261 1261    fileops.c: No such file or directory. (gdb) bt
#0  0x00007ffff7a8dffe in _IO_new_file_write (f=0x7ffff7dd4400 <_IO_2_1_stdout_>, data=0x7ffff7ff7000, n=5) at fileops.c:1261
#1  0x00007ffff7a8f4dc in new_do_write (to_do=5, data=0x7ffff7ff7000 "WORK\n", fp=0x7ffff7dd4400 <_IO_2_1_stdout_>) at fileops.c:538
#2  _IO_new_do_write (fp=fp@entry=0x7ffff7dd4400 <_IO_2_1_stdout_>, data=0x7ffff7ff7000 "WORK\n", to_do=5) at fileops.c:511
#3  0x00007ffff7a8f8b3 in _IO_new_file_overflow (f=0x7ffff7dd4400 <_IO_2_1_stdout_>, ch=10) at fileops.c:876
#4  0x00007ffff7a84f72 in _IO_puts (str=0x4005d4 "WORK") at ioputs.c:42
#5  0x000000000040053b in main ()