C++: статическая переменная и рекурсия

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

Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

C++: статическая переменная и рекурсия

Сообщение Red User »

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

#include <iostream>

//#define BAD

void test(int x)
{
    #ifdef BAD
    static int y = x;
    #else
    static int y;
    y = x;
    #endif
    std::cout << y << " ";
    if (!y)
        std::cout << std::endl;
    else
        test(x - 1);
}

int main()
{
    test(20);

    return 0;
}


Если в этой программе раскомментировать #define BAD, то она зацикливается и завершается Segmentation fault (видимо, переполняется стек). Компилировал я это g++ (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21). Почему так различается поведение программы при казалось бы незначительном изменении? И вообще, соответствует ли такое поведение стандарту?
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Galaxy Master
Сообщения: 142
ОС: Debian GNU/Linux

Re: C++: статическая переменная и рекурсия

Сообщение Galaxy Master »

Да такое поведение полностью соответствует стандарту!!!
Учите матчасть про статические переменные!

static int y = x; - выполняется ТОЛЬКО 1 раз при инициализации и всегда у вас равно 20, а вот x... постоянно уменьшается...
и ваше условие if (!y)
не выполняется никогда!!!
Далее вы уходите в бесконечную рекурсию пока не падаете тут

#0 0xb7d761ce in _IO_file_xsputn () from /lib/i686/cmov/libc.so.6
#1 0xb7d6c76f in fwrite () from /lib/i686/cmov/libc.so.6
#2 0xb7f17026 in ?? () from /usr/lib/libstdc++.so.6
#3 0xb7f0a943 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long> () from /usr/lib/libstdc++.so.6
#4 0xb7f0aa8d in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put () from /usr/lib/libstdc++.so.6
#5 0xb7f1b5b0 in std::ostream::_M_insert<long> () from /usr/lib/libstdc++.so.6
#6 0xb7f1b724 in std::ostream::operator<< () from /usr/lib/libstdc++.so.6
#7 0x08048990 in test (x=-524089) at test.cpp:13
#8 0x080489cd in test (x=-524088) at test.cpp:17
#9 0x080489cd in test (x=-524087) at test.cpp:17
#10 0x080489cd in test (x=-524086) at test.cpp:17
#11 0x080489cd in test (x=-524085) at test.cpp:17
#12 0x080489cd in test (x=-524084) at test.cpp:17
#13 0x080489cd in test (x=-524083) at test.cpp:17
#14 0x080489cd in test (x=-524082) at test.cpp:17


(Это back trace отладчика gdb при просмотре коры (core dump) вашей упавшей по сегфолу программы)

Судя по посту вы с ним не знакомы.
Познакомьтесь.
Очень рекомендую и на такие грабли больше не наступите.
Да, и еще подучите с/с++, чтоб о стандартах меньше вопросов было.
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: C++: статическая переменная и рекурсия

Сообщение Red User »

Galaxy Master писал(а):
23.02.2008 00:54
Да такое поведение полностью соответствует стандарту!!!

Да, действительно, соответствует (если кому ещё интересно, 6.7.4). Спасибо за ответ
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали: