我是C的新手,所以如果这个查询是基本的,请原谅我。
我想从另一个函数调用main(),使程序无限运行。代码在这里:
#include <stdio.h>
void message();
int main()
{
message();
return 0;
}
void message()
{
printf("This is a test message. n");
main();
}
我希望看到这个程序无限运行。然而,它运行了一段时间,然后突然停止。使用我在测试消息旁边打印的计数器变量,我发现语句"This is a test message."被打印了174608次,之后我得到了一条错误消息
分段故障(堆芯转储)
并且程序终止。这个错误是什么意思?为什么这个程序只运行174608次(为什么不是无限次)?
您有来自无限递归的堆栈溢出。在main
:中进行无限循环
int main()
{
while (1)
{
//...
}
}
相互递归会占用堆栈空间。如果将递归放在main()
本身中,编译器可能会识别尾部递归,并通过迭代替换它。[为了娱乐和教育,不要在家里尝试,孩子们…]:
#include <stdio.h>
void message();
int main()
{
message();
return main();
}
void message()
{
printf("This is a test message. n");
}
GCC识别优化级别=2及以上的尾部递归。gcc-O2-s main.c:的main.s输出
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
.p2align 4,,7
.p2align 3
.L4:
call message
jmp .L4
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
.section .note.GNU-stack,"",@progbits
这并不等同于while(1) {...}
或for(;;) {...}
,它们会给您带来无限循环。
每次调用函数(例如,main()
或message()
)时,都会将一些值推入堆栈。当函数被调用过多次时,堆栈会被填满,最后会溢出,从而导致"堆栈溢出"错误。
请注意,此错误与此站点无关,尽管它们恰好具有相同的名称:)