2016-03-26 7 views
-2

Я новичок в C, поэтому простите меня, если этот запрос является основным.Вызов основной из другой функции

Я хочу вызвать main() из другой функции и сделать программу бесконечной. Код находится здесь:

#include <stdio.h> 

void message(); 

int main() 
{ 
    message(); 

    return 0; 
} 

void message() 
{ 
    printf("This is a test message. \n"); 

    main(); 
} 

Ожидается, что эта программа будет работать бесконечно. Тем не менее, он работает некоторое время, а затем внезапно останавливается. Используя переменную счетчика, которую я напечатал рядом с тестовым сообщением, я обнаружил, что утверждение «Это тестовое сообщение». печатается 174608 раз, после чего я получаю сообщение об ошибке

вина Сегментация (ядро сбрасывали)

и программа завершается. Что означает эта ошибка? И почему программа работает только 174608 раз (почему бы и не бесконечно)?

+4

Есть ли у вашей машины бесконечная RAM? –

+2

Когда вызывается метод, обратный адрес помещается в стек. Когда метод возвращается, адрес снова берется из стека. Но ваши методы никогда не возвращаются, они поочередно называют друг друга. Поэтому после 174608 звонков ваш стек просто заполнен. И этот стек overlow приводит к ошибке сегментации, которую вы получаете. Нет четкого сообщения об ошибке, поскольку переполнение стека развращает весь процесс и затрудняет обработку ошибок. –

+0

Ответ René предоставлен правильно и должен быть ответом не просто комментарием. Я просто хочу добавить, что вы никогда не должны называть главную функцию в своей программе. Никогда. Если вы хотите использовать бесконечный цикл в то время как (1) или для (;;). – lsrom

ответ

2

У вас есть переполнение стека из бесконечной рекурсии. Сделайте бесконечный цикл в main:

int main() 
{ 
    while (1) 
    { 
    //... 
    } 
} 
+1

Эй, это имя сайта! – Kupiakos

+0

@ Kupiakos Вот и все :) – i486

0

Общая стоимость рекурсии. Если вы поместите рекурсию в main(), компилятор может распознать хвостовую рекурсию и заменить ее на итерацию. [Для развлечения и образования, не пытайтесь повторить это дома, дети ...]:

#include <stdio.h>  

void message(); 

int main() 
{ 
    message(); 

    return main(); 
}  

void message() 
{  
    printf("This is a test message. \n"); 
} 

GCC распознает хвостовую рекурсию в уровне оптимизации = 2 и выше. main.s выход для GCC -O2 -S main.c:

 .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 
1

Это не эквивалентно while(1) {...} или for(;;) {...}, которые дают вам бесконечные циклы.

Каждый раз, когда функция (например, main() или message()) вызывается, некоторые значения помещаются в стек . Когда функции вызываются слишком много раз, ваш стек заполняется и, наконец, переполняется, что дает вам ошибку «переполнение стека».

Обратите внимание, что эта ошибка не имеет ничего общего с этим сайтом, хотя они происходят, чтобы иметь такое же имя :)

Смежные вопросы