Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
#1

Что и куда девается... - C++

14.11.2009, 21:19. Просмотров 1490. Ответов 25
Метки нет (Все метки)

Не очень хорошо знаю несколько вещей, а узнать хотелось бы очень.

Вопрос 1.
Локально объявленные переменные удаляются из памяти по окончании блока, так? Или же они где-то повисают, просто становясь недоступными?
Например.
C++
1
2
3
4
void main (void)
{
for (int a=0; a<8; a++) {/*код*/}
}
Переменная a удалилась по выходе из for или где-то "провисла"?

Вопрос 2.
Глобально объявленные переменные: каково их время жизни?
C++
1
2
3
4
5
int x;
void main (void)
{
//код
}
Получается, что переменная x живет "вечно" и везде доступна, так?

Вопрос 3.
Функции и указатели на функции, объявленные глобально и локально. Тот же самый вопрос про них: время их жизни.

P.S. Буду очень благодарен за ссылку на соответствующую статью про распределение памяти, понятную не особо продвинутому среднестатистическому студенту.

Товарищи крутые программеры, не злитесь, хочется выяснить раз и навсегда
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
14.11.2009, 21:32     Что и куда девается... #2
Глобально объявленные переменные: каково их время жизни?
это так:
Получается, что переменная x живет "вечно" и везде доступна, так?
Цитата Сообщение от Red Planet Посмотреть сообщение
Товарищи крутые программеры, не злитесь, хочется выяснить раз и навсегда
форум как сказал на ВА создан не для крутых программеров,а для новичков,чтобы задавали вопросы,неважно какие вопросы

Добавлено через 1 минуту
Вопрос 1.
для этого сам пиши код
это твой код
C++
1
2
3
4
void main (void)
{
for (int a=0; a<8; a++) {/*код*/}
}
после фигурной закрывающейся скобки пиши такое
C++
1
cout<<i;
понятно для чего?
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
14.11.2009, 21:51  [ТС]     Что и куда девается... #3
C++
1
2
for (int a=0; a<5; a++) cout <<a;
cout <<a;
Пишет undifined symbol 'a'. Ясно, значит ни о какой переменной a после выхода из цикла, то есть за {} компилятор не знает, то есть она удаляется.
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
14.11.2009, 21:53     Что и куда девается... #4
Цитата Сообщение от Red Planet Посмотреть сообщение
Пишет undifined symbol 'a'. Ясно, значит ни о какой переменной a после выхода из цикла, то есть за {} компилятор не знает, то есть она удаляется.
да
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
14.11.2009, 22:10  [ТС]     Что и куда девается... #5
МедведЪ, а про функции (Вопрос 3) случайно не знаешь?
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
14.11.2009, 22:11     Что и куда девается... #6
Цитата Сообщение от Red Planet Посмотреть сообщение
Функции и указатели на функции, объявленные глобально и локально
до указателей я еще не дошел,но думаю тот же принцип,если гбальные то всегда если нет то нет
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
14.11.2009, 22:15     Что и куда девается... #7
Цитата Сообщение от МедведЪ Посмотреть сообщение
до указателей я еще не дошел,но думаю тот же принцип,если гбальные то всегда если нет то нет
именно, всё что объявленно в {} живёт и имеет смысл тока в этих {}
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
14.11.2009, 22:17     Что и куда девается... #8
C++
1
именно, всё что объявленно в {} живёт и имеет смысл тока в этих {}
спасибо,уяснил,я сомневался на счет циклов
victor_g
60 / 60 / 2
Регистрация: 09.11.2009
Сообщений: 198
14.11.2009, 22:24     Что и куда девается... #9
а функции - вообще нельзя объявлять локально
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
14.11.2009, 22:37     Что и куда девается... #10
Цитата Сообщение от victor_g Посмотреть сообщение
а функции - вообще нельзя объявлять локально
а кто их локально объявлял?Оо или я что то упустил
Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
14.11.2009, 22:47     Что и куда девается... #11
victor_g, почему же нельзя?
C++
1
2
3
4
5
6
int main()
{
   void function(){/*код функции*/}
   fuction();
   return 0;
}
Другой вопрос, целесообразна ли такая функция, но это уже на усмотрение каждого.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2009, 08:12     Что и куда девается... #12
объявлять можно, определять нельзя

Цитата Сообщение от Red Planet
Функции и указатели на функции, объявленные глобально и локально.
указатель - переменная, которая хранит данные, которые являются адресом
переменная существует в том блоке, в котором создана
блоки могут быть вложенными
C
1
2
3
4
5
6
7
    int i;
    {
        int i;
        {
            int i;
        }
    }
это одноимённые разные переменные
глобальная переменная существует до завершения программы
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
15.11.2009, 13:21  [ТС]     Что и куда девается... #13
Цитата Сообщение от accept Посмотреть сообщение
объявлять можно, определять нельзя
А где ж их тогда определять, если они объявлены локально? Что-то я логику не понял... Поясните пожалуйста
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
15.11.2009, 15:59     Что и куда девается... #14
Цитата Сообщение от Red Planet Посмотреть сообщение
А где ж их тогда определять, если они объявлены локально? Что-то я логику не понял... Поясните пожалуйста
Вложенных (а не "локальных") функций в Си нет. Они есть в паскале, алголе и прочих дремучих языках. Из всех разновидностей Си только GNU-C поддерживает вложенные процедуры. Что касается объявления - то объявление это просто уведомление компилятору, что где-то есть функция с таким-то именем и таким-то прототипом, поэтому объявление можно втыкать где угодно. Реально определена функция может быть, например, в другом файле или в библиотеке

Применительно к функциям используется термин "вложенный", а не "Локальный", потому что функция е создаётся и не удаляется, как это происходит с локальными переменными. Функция есть всегда, но "видна" для прямого вызова она только из той процедуры, в которой она определена (т.е. из "охватывающей" процедуры).

По поводу твоих первоначальных вопросов. По первым двум пунктам ответ "да". Правда термин "удаляется" немного некорректен, ну пусть будет "удаляется", для начального уровня это будет нормально. По поводу третьего вопроса: указатель на функцию является обычной переменной и ничем не отличается от любой переменной другого типа
victor_g
60 / 60 / 2
Регистрация: 09.11.2009
Сообщений: 198
15.11.2009, 18:34     Что и куда девается... #15
Цитата Сообщение от Red Planet Посмотреть сообщение
Вопрос 3.
Функции и указатели на функции, объявленные глобально и локально. Тот же самый вопрос про них: время их жизни.
->

Цитата Сообщение от Red Planet Посмотреть сообщение
Функции ..., объявленные глобально
- я как раз на это отвечал...
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.11.2009, 03:11     Что и куда девается... #16
Цитата Сообщение от Red Planet
А где ж их тогда определять
определять можно только в общей области, можно вообще отдельный файл сделать определить там функцию (определение включает тело), а потом в главной функции записать объявление, тогда оно будет видно внутри главной функции и больше нигде (вызовы можно делать только там, где видно объявление), поэтому объявления пишут тоже в общей области и сверху, чтобы в каждой функции ниже можно было делать вызов (общая область видна в каждой функции)
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
16.11.2009, 04:19     Что и куда девается... #17
Совет автору:
Как ты уже понял, в арсенале программёра- любого- должно быть несколько инструментов. Отладчик- оди из них. Скачивай OllyDbg, посвяти ему плотно несколько дней и многое прояснишь для себя. Увидишь своими глазами ячейки памяти, предназначеннные для каждой переменной, увидишь, как изменяется их содержимое и изменяется ли вообще и при каких условиях.

100% тебе рано или поздно придётся это делать.
...А так-то мы все здесь материаличты. Ничто ниоткуда не берётся и ничто никуда не исчезает. То же и с переменными. Как была под переменную выделена ячейка памяти, так она, эта ячейка никуда до конца программы не денется, не исчезнет.
...В общем, занимайся.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
16.11.2009, 20:31     Что и куда девается... #18
Как была под переменную выделена ячейка памяти, так она, эта ячейка никуда до конца программы не денется, не исчезнет.
Это не совсем верно.
Локальные автоматические переменные в функции создаются при входе в функцию и удаляются при выходе.
Делается это при помощи стека.
Так что ячейка пропадает

Добавлено через 59 секунд
Локально объявленные переменные удаляются из памяти по окончании блока, так? Или же они где-то повисают, просто становясь недоступными?
Факт в том что переменные становятся недоступными.
А вот удаляются ли они из памяти или нет - уже зависит от компилятора и его настроек.

Добавлено через 49 секунд
Глобально объявленные переменные: каково их время жизни?
Глобальные переменные существуют все время - можно сказать еще до реального вызова main().

Добавлено через 2 минуты
Функции и указатели на функции, объявленные глобально и локально. Тот же самый вопрос про них: время их жизни.
Функция - это некий код.
Обычные функции существуют все время выполнения.
А вот если подгружать динамические библиотеки - тогда можно подгрузить код, можно выгрузить. Обращение идет через указатель на функции (код).
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
16.11.2009, 21:28     Что и куда девается... #19
Цитата Сообщение от odip Посмотреть сообщение
Это не совсем верно.
Локальные автоматические переменные в функции создаются при входе в функцию и удаляются при выходе.
Делается это при помощи стека.
Так что ячейка пропадает
Я чейка не пропадает.
Если под стек процессу было выделено столко-то ячеек то ему столько-то и выделено.

Просто-напросто если локальные переменны лежали по адресам стека 100, 101, 102 при выходе из функции они как бы исчезнут. Это значит, что верхушка стека теперь станет больше, чем 102. Например, 105 и соответственно задействованный стек теперь располагает ячейками с номерами: 105, 106, 107 108 и так лдалее в зависимости от размера стека.

Вопрос: что стало с ячейками стека 104, 103, 102 и так далее- с теми, где лежали локальные переменные?
А ничего с ними не стало. Как были так и остались.
Хотя у каждого своё мнение может быть на этот счёт. У нас демократия, да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2009, 21:55     Что и куда девается...
Еще ссылки по теме:

Куда дальше? C++
C++ Куда следует пойти туристам, что бы попасть на автобусную остановку?
Вложенные циклы. Что куда вложить? C++
C++ Куда создается файл?
Куда записывается \0 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
16.11.2009, 21:55     Что и куда девается... #20
kravam, попробую пояснить в твоих же терминах. Объяснение будет, мягко говоря, на пальцах. В жизни оно несколько не так, но для общего понимания, думаю, этого достаточно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void func (void)
{
  int *p1, *p2;
 
  ...
  {
    int x; // попало в ячейку 100
    int y; // папало в ячейку 101
 
    ...
    p1 = &x;
  }
 
  // По достижению конца лексического блока компилятор считает,
  // что 100 и 101 больше не нужны. Естественно сами ячейки никуда не деваются
  // Но поскольку они больше не нужны, то их можно переиспользовать,
  // что и происходит в следующем лексическом блоке
 
  {
    int a; // попало в ячейку 100
    int b; // папало в ячейку 101
 
    ...
    p2 = &a;
  }
 
  // По тексту вроде бы как получается, что в p1 и p2 записывались
  // адреса на разные переменные, однако в этой точке значения указателей
  // p1 и p2 равны (это не обязательно так, зависит от того, как поступит компилятор,
  // но такая ситуация не исключается). Однако по стандарту использование p1 и p2
  // за пределами соотвествующих фигурных скобок попадает под "undefined behaviour"
}
Yandex
Объявления
16.11.2009, 21:55     Что и куда девается...
Ответ Создать тему
Опции темы

Текущее время: 06:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru