return main();

Модератор: Модераторы разделов

richrd
Сообщения: 227

return main();

Сообщение richrd »

Простой hello world, только в return main(); на конце.
Запускал в WMVare. Ошибка сегментирования возникала на разных по циклах рекурсии. // надеюсь правильно выразился.
На настоящем "железе" строго на 654540 или 654950.
Причём от объявления "void main()" или "int main()" это не зависит.
Объясните, пожалуйста, суть происходящих процессов.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: return main();

Сообщение t.t »

Приведите есь исходник. Из объяснения словами мало что понятно.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: return main();

Сообщение agentprog »

думал, что return main() в случае void main() откажется компилиться, но нет, оно даже заработало.
итого:

Код: Выделить всё

#include <stdio.h>

/*int*/void main() {
        static int a = 0;
        a++;
        printf("Hallo, World, in %dth time!\n", a);
        return main();
}

компилим просто `gcc -o t t.c`, запускаем, имеем много-много строк, кончающихся:
...
Hallo, World, in 261745th time!
Hallo, World, in 261746th time!
Hallo, World, in 261747th time!
Ошибка сегментирования
No problems - just solutions!
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: return main();

Сообщение eddy »

У меня сдохла на 174572 раз.
Это, по видимому, либо ограничения на глубину рекурсии, либо стек кончился, либо еще что-нибудь.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
richrd
Сообщения: 227

Re: return main();

Сообщение richrd »

t.t писал(а):
12.07.2010 22:54
Приведите есь исходник. Из объяснения словами мало что понятно.

вот:

Код: Выделить всё

#include <stdio.h>
void main()
{
 printf("1");
 return main();
}


agentprog писал(а):
12.07.2010 23:00
думал, что return main() в случае void main() откажется компилиться, но нет, оно даже заработало.
итого:

Код: Выделить всё

#include <stdio.h>

/*int*/void main() {
        static int a = 0;
        a++;
        printf("Hallo, World, in %dth time!\n", a);
        return main();
}

компилим просто `gcc -o t t.c`, запускаем, имеем много-много строк, кончающихся:
...
Hallo, World, in 261745th time!
Hallo, World, in 261746th time!
Hallo, World, in 261747th time!
Ошибка сегментирования


хмм. Я считал количество входов выводом в файл, а затем

Код: Выделить всё

cat file | wc -l
Не понимаю, ведь при вызове в Вашем примере 'а' должно обнуляться. Нет?
Спасибо сказали:
richrd
Сообщения: 227

Re: return main();

Сообщение richrd »

кстати при выводе в файл быстрее получается : )
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: return main();

Сообщение eddy »

richrd писал(а):
12.07.2010 23:27
'а' должно обнуляться. Нет?

Оно же static. Это все равно, что объявить его вне main.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: return main();

Сообщение t.t »

А зачем вызывать main изнутри main? Да, признаться, я вообще не пойму, зачем её откуда-либо вызывать. Особенно безусловно: это ведь по определению приведёт к бесконечной рекурсии.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: return main();

Сообщение eddy »

t.t писал(а):
13.07.2010 00:03
это ведь по определению приведёт к бесконечной рекурсии.

Ну, наверное, целью и было проверить, при какой глубине рекурсии программа сегфолтится.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: return main();

Сообщение /dev/random »

Собирайте с -O2 и не будет сегфолтиться вообще.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: return main();

Сообщение eddy »

/dev/random писал(а):
13.07.2010 07:41
Собирайте с -O2 и не будет сегфолтиться вообще.

И правда. Как будто рекурсию заменили итерацией.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: return main();

Сообщение NickLion »

eddy писал(а):
13.07.2010 08:53
И правда. Как будто рекурсию заменили итерацией.

Оптимизация хвостовой рекурсии ;)
Спасибо сказали: