Простой hello world, только в return main(); на конце.
Запускал в WMVare. Ошибка сегментирования возникала на разных по циклах рекурсии. // надеюсь правильно выразился.
На настоящем "железе" строго на 654540 или 654950.
Причём от объявления "void main()" или "int main()" это не зависит.
Объясните, пожалуйста, суть происходящих процессов.
return main();
Модератор: Модераторы разделов
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: return main();
Приведите есь исходник. Из объяснения словами мало что понятно.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 362
- Статус: Ad Astra per aspera
- ОС: openSUSE 11.4, Arch
Re: return main();
думал, что return main() в случае void main() откажется компилиться, но нет, оно даже заработало.
итого:
компилим просто `gcc -o t t.c`, запускаем, имеем много-много строк, кончающихся:
итого:
Код: Выделить всё
#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!
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: return main();
У меня сдохла на 174572 раз.
Это, по видимому, либо ограничения на глубину рекурсии, либо стек кончился, либо еще что-нибудь.
Это, по видимому, либо ограничения на глубину рекурсии, либо стек кончился, либо еще что-нибудь.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Сообщения: 227
Re: return main();
вот:
Код: Выделить всё
#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
-
- Сообщения: 227
Re: return main();
кстати при выводе в файл быстрее получается : )
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: return main();
Оно же static. Это все равно, что объявить его вне main.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: return main();
А зачем вызывать main изнутри main? Да, признаться, я вообще не пойму, зачем её откуда-либо вызывать. Особенно безусловно: это ведь по определению приведёт к бесконечной рекурсии.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: return main();
Ну, наверное, целью и было проверить, при какой глубине рекурсии программа сегфолтится.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Администратор
- Сообщения: 5413
- ОС: Gentoo
Re: return main();
Собирайте с -O2 и не будет сегфолтиться вообще.
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: return main();
И правда. Как будто рекурсию заменили итерацией.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64