The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"застраял с ANSI C"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"застраял с ANSI C" 
Сообщение от anatoly Искать по авторуВ закладки on 02-Ноя-05, 10:14  (MSK)
Приветствую,

в процессе изучения 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', то и в этом случае ничего не меняется и значение сохраняется до следующего вызова. Почему так происходит?

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "застраял с ANSI C" 
Сообщение от ilya Искать по авторуВ закладки(??) on 02-Ноя-05, 10:52  (MSK)
>Почему так происходит?

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "застраял с ANSI C" 
Сообщение от sandy emailИскать по авторуВ закладки(??) on 05-Ноя-05, 14:45  (MSK)
>>Почему так происходит?
>
>Если переменная 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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "застраял с ANSI C" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 05-Ноя-05, 16:30  (MSK)
просто у вас автоматическая переменная попадает на одно и то-же место в стеке, куда в предыдущий вызов вы поместили какие-то данные.

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

static int i = 0;

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру