我是C的新手,请原谅我,如果这个查询是基本的。
我想从另一个函数调用main(),并使程序无限运行。代码在这里:
#include <stdio.h>
void message();
int main()
{
message();
return 0;
}
void message()
{
printf("This is a test message. \n");
main();
}
我希望看到这个程序无限运行。然而,它运行一段时间然后突然停止。使用我在测试消息旁边打印的计数器变量,我发现声明“这是测试消息”。打印174608次,之后收到错误消息
分段错误(核心转储)
并且程序终止。这个错误是什么意思?为什么程序只运行174608次(为什么不能无限制地运行)?
答案 0 :(得分:1)
你有无限递归的堆栈溢出。在main
中进行无限循环:
int main()
{
while (1)
{
//...
}
}
答案 1 :(得分:0)
相互递归会降低堆栈空间。如果您将递归放在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
答案 2 :(得分:0)
这不等同于while(1) {...}
或for(;;) {...}
,它们为您提供无限循环。
每次调用函数(例如,main()
或message()
)时,某些值都会被推入堆栈。当函数被调用太多次时,你的堆栈会被填满,最后溢出,给你一个堆栈溢出&#34;错误。
请注意,此错误与此网站无关,但它们碰巧具有相同的名称:)