C/C++ - Выполнение кода и выделение памяти для переменной

Ответить
Аватара пользователя
Mr666

C/C++ - Выполнение кода и выделение памяти для переменной

Сообщение Mr666 »

Привет.



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



#include



int main()

{

goto label;

auto int a;

label:

a = -32;

printf("%d\n", a);

}



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



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




Цитата:



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



Что-то я не понял как выделилась память для переменной a если код объявления был пропущен с помощью оператора goto?
Аватара пользователя
Admiral

Re: C/C++ - Выполнение кода и выделение памяти для переменной

Сообщение Admiral »

Если ставить точку остановки на auto int a; то отладчик останавливается аж на a = -32; со значением а=-858993460 (компилятор в Visual C++2008 Express), а на printf уже с присвоенным -32.

Самое интересное, если вспомнить что return 0; ещё не хватает, но это не так важно для сабжа, и поставить его перед auto int a; выхода не происходит. Это мне напоминает Pascal, в котором отдельным пунктом есть секция var, и которая не выполняется при трассировки, но она указ компилятору.
Аватара пользователя
Mr666

Re: C/C++ - Выполнение кода и выделение памяти для переменной

Сообщение Mr666 »

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



1 #include

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 я поставил для декоративной наглядности, что речь идёт именно о таких переменных.
Ответить

Вернуться в «Программирование и базы данных»