URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4802
[ Назад ]

Исходное сообщение
"застраял с ANSI C"

Отправлено anatoly , 02-Ноя-05 10:14 
Приветствую,

в процессе изучения ANSI C наткнулся на следующий эффект. Пусть есть такой код:

#include <stdio.h>
void f1(int j)
{
  static int i;
  i += j;
}

int main(void)
{
  f1(1);
  f1(2);

  return 0;
}

Согласно K&R (а значит и стандарту), статический объект (в моем случае переменная 'i' в функции f1()) будет сохранять свое значение после выхода из блока или функции. Так оно и есть, но если убрать спецификатор 'static', то и в этом случае ничего не меняется и значение сохраняется до следующего вызова. Почему так происходит?

Заранее спасибо!


Содержание

Сообщения в этом обсуждении
"застраял с ANSI C"
Отправлено ilya , 02-Ноя-05 10:52 
>Почему так происходит?

Если переменная static - то определено стандартом, что переменная сохраняет свое значение, если не static - то поведение "не определено", т.е. может быть, а может не быть.

P.S. Память, отведенную под i между вызовами f1 никто не трогает.


"застраял с ANSI C"
Отправлено sandy , 05-Ноя-05 14:45 
>>Почему так происходит?
>
>Если переменная static - то определено стандартом, что переменная сохраняет свое значение,
>если не static - то поведение "не определено", т.е. может быть,
>а может не быть.
>
>P.S. Память, отведенную под i между вызовами f1 никто не трогает.

#include <stdio.h>

int f1(int j)
{
  static int i;
  i += j;
  return i;
}

int main(void)
{
  printf("%d\n",f1(1));
  printf("%d\n",f1(2));
  return 0;
}

Тогда, все, вроде бы, правильно:
$> 1
$> 3

Если убрать static, - почемуто:
$> 2
$> 4

Если убрать static и инициализировать нулем:
$> 1
$> 2


"застраял с ANSI C"
Отправлено MaximKuznetsov , 05-Ноя-05 16:30 
просто у вас автоматическая переменная попадает на одно и то-же место в стеке, куда в предыдущий вызов вы поместили какие-то данные.

Если же например вызовите f1() из другой функции - то и автоматические переменные лягут по другим адресам и мусор в них будет уже другой.


"застраял с ANSI C"
Отправлено chip , 02-Ноя-05 17:46 
>Приветствую,
>
>в процессе изучения ANSI C наткнулся на следующий эффект. Пусть есть такой
>код:
>
>#include <stdio.h>
>void f1(int j)
>{
>  static int i;

static int i = 0;

инициализация будет произведена единожды.