вывод программы - PullRequest
       7

вывод программы

0 голосов
/ 26 августа 2010
#include<stdio.h>

void f(void)
{
    int s = 0;
    s++;
    if(s == 10)
        return;
    f();
    printf("%d ", s);
}
int main(void)
{
    f();
}

каков вывод программы! ??ошибка сегментации ... что это?

Ответы [ 10 ]

6 голосов
/ 26 августа 2010

Поскольку s является локальной переменной, каждый рекурсивный вызов f() получает свою собственную копию. Таким образом, каждый раз s будет равен 1, и вы получите исключение переполнения стека.

4 голосов
/ 26 августа 2010

Проблема в том, что вы статически не инициализируете s. Так что всегда будет начинаться с 0 каждый раз, когда вы звоните f(), а f() продолжает вызывать себя снова и снова, но if(s == 10) никогда не встречается Стек вызовов в конечном итоге переполняется и бум, ошибка сегментации.

2 голосов
/ 26 августа 2010

Проблема в том, что вы звоните f рекурсивно, ничего не меняя каждый раз. Вы, вероятно, получаете переполнение стека.

Каждый раз, когда вы звоните f, вы инициализируете s до 0 и увеличиваете его. Оно никогда не достигнет 10.

Что вам нужно сделать, это либо сделать s параметром для f, либо сделать s статическим.

1 голос
/ 26 августа 2010

Программа заходит в бесконечный цикл. Причиной этого является: s является локальным для f (), поэтому всякий раз, когда вызывается f (), s инициализируется равным 0. Затем он увеличивается на 1, и снова вызывается & f (). На этот раз f () также использует свою локальную копию и инициализирует s в 0 и снова вызывает f () рекурсивно. Это создает бесконечный цикл, а программа генерирует ошибку сегментации. Причиной ошибки seg является переполнение стека из-за рекурсивных бесконечных вызовов. Чтобы исправить это, либо сделайте s статическим, либо сделайте его глобальным, а не локальным.

1 голос
/ 26 августа 2010

Ваша программа представляет собой бесконечный цикл;Вы получаете ошибку сегментации, потому что в конечном итоге переполняете свой стек.

0 голосов
/ 26 августа 2010

Результатом этой программы является имя этого сайта.

Как и другие предлагали вам объявить s как static int s = 0

0 голосов
/ 26 августа 2010

Это может быть более интересная программа:

void f(int s)
{
  s++;
  if(s == 10)
    return;
  f(s);
  printf("%d ", s);
}

int main(void) 
{
  f(0);
}

Это напечатает:

9 8 7 6 5 4 3 2 1

0 голосов
/ 26 августа 2010

Бесконечный цикл. Вот, наверное, что-то похожее на то, что вы хотите

#include<stdio.h>

void f(int s)
{
    s++;
    if(s == 10)
        return;
    f(s);
    printf("%d ", s);
}
int main(void)
{
    f(0);
}
0 голосов
/ 26 августа 2010

Это рекурсивная функция, которая вызывает сама себя. Однако это бесконечный цикл, потому что int s = 0; сбрасывает счетчик каждый раз, когда он вызывается. Он напечатает бесконечную строку 0 с.

Пример решения:

int main (void) {
   f(0);
}

void f (int s) {
   if (s == 10)
      return;
   printf("%d ", s);
   f(s++);
}

Я не очень хорошо разбираюсь в синтаксисе Си, но идея в том, что звук.

0 голосов
/ 26 августа 2010

Как насчет того, чтобы сделать вашу переменную статической?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...