Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Выполнение кода и выделение памяти для переменной (http://forum.oszone.net/showthread.php?t=109146)

Mr666 14-06-2008 14:07 825811

Выполнение кода и выделение памяти для переменной
 
Привет.

Ниже приведу код иллюстрирующий мой вопрос:

#include <stdio.h>

int main()
{
goto label;
auto int a;
label:
a = -32;
printf("%d\n", a);
}

В результате выполнения программы мы получаем -32, то есть была полноценно использована переменная, код объявления которой при запуске программы выполнится не должен был.

Цитирую из книжки (Программирование на языке СИ) на счёт объявления переменной с классом памяти auto (который я задал явным образом для иллюстрации):

Цитата:

Переменная с классом памяти auto имеет локальное время жизни и видна только в блоке, в котором объявлена. Память для такой переменной выделяется при входе в блок и освобождается при выходе из блока. При повторном входе в блок этой переменной может быть выделен друго участок памяти.
Что-то я не понял как выделилась память для переменной a если код объявления был пропущен с помощью оператора goto?

Admiral 14-06-2008 14:55 825855

Если ставить точку остановки на auto int a; то отладчик останавливается аж на a = -32; со значением а=-858993460 (компилятор в Visual C++2008 Express), а на printf уже с присвоенным -32.
Самое интересное, если вспомнить что return 0; ещё не хватает, но это не так важно для сабжа, и поставить его перед auto int a; выхода не происходит. Это мне напоминает Pascal, в котором отдельным пунктом есть секция var, и которая не выполняется при трассировки, но она указ компилятору.

Mr666 14-06-2008 15:19 825885

Если поставить точку остановки на auto int a; даже без goto:

1 #include <stdio.h>
2
3 int main()
4 {
5 // goto label;
6 auto int a;
7 // label:
8 a = -32;
9 printf("%d\n", a);
10 return 0;
11 }

То при трассировке тоже будет перескакивать на a = -32;

Это уже говорит о том, что auto int a; не является пошаговой инструкцией, например как a = -32;, но чем тогда является auto int a; и где оно записывается если не в пошаговой инструкции?

P.S. Классификатор auto я поставил для декоративной наглядности, что речь идёт именно о таких переменных.


Время: 15:43.

Время: 15:43.
© OSzone.net 2001-