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

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

Войти
Регистрация
Восстановить пароль
 
Gleb4uk
2 / 2 / 0
Регистрация: 08.08.2012
Сообщений: 58
#1

Автоматические переменные - C++

24.02.2013, 16:04. Просмотров 924. Ответов 4
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане!

В книге Стивена Прата по С++ приводится следующий листинг:

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
// delete.cpp -- using the delete operator
#include <iostream>
#include <cstring>      // or string.h
using namespace std;
char * getname(void);   // function prototype
int main()
{
    char * name;        // create pointer but no storage
 
    name = getname();   // assign address of string to name
    cout << name << " at " << (int *) name << "\n";
    delete [] name;     // memory freed
 
    name = getname();   // reuse freed memory
    cout << name << " at " << (int *) name << "\n";
    delete [] name;     // memory freed again
    // cin.get();
    // cin.get();
    return 0;
}
 
char * getname()        // return pointer to new string
{
    char temp[80];      // temporary storage
    cout << "Enter last name: ";
    cin >> temp;
    char * pn = new char[strlen(temp) + 1];
    strcpy(pn, temp);   // copy string into smaller space
 
    return pn;          // temp lost when function ends
}
на основании этого листинга даётся пояснение автоматически выделяемой памяти для переменных, объявленных внутри блоков (в данной ситуации - внутри функции getname() ). Речь о том что указатель pn объявляется для того, чтоб не потерять значение вводимой строки.
Тут возникает вопрос: почему значение символьного массива удаляется при выходе из функции, а значение области памяти, на которую указывает вышеупомянутый pn остаётся?
Сразу второй вопрос: почему не передать функции значение массива сразу через return?
И третий вопрос: если бы функция возвращала массив, то как правильно её объявить, сразу после круглых скобок с перечнем параметров ставить квадратные с количеством элементов массива?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 16:04     Автоматические переменные
Посмотрите здесь:

Переменные,значение функции,вспомогательные переменные. C++
C++ Переменные
файловые переменные C++
C++ Переменные
C++ глобальные переменные
Сравнить переменные C++
Переменные в c++ C++
C++ Автоматические конвертеры стилей наименования объектов
C++ Переменные
Переменные C++
C++ Символьньные переменные
Static переменные C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KostyaKulakov
Заблокирован
24.02.2013, 16:08     Автоматические переменные #2
Цитата Сообщение от Gleb4uk Посмотреть сообщение
Доброго времени суток, уважаемые форумчане!

В книге Стивена Прата по С++ приводится следующий листинг:

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
// delete.cpp -- using the delete operator
#include <iostream>
#include <cstring>      // or string.h
using namespace std;
char * getname(void);   // function prototype
int main()
{
    char * name;        // create pointer but no storage
 
    name = getname();   // assign address of string to name
    cout << name << " at " << (int *) name << "\n";
    delete [] name;     // memory freed
 
    name = getname();   // reuse freed memory
    cout << name << " at " << (int *) name << "\n";
    delete [] name;     // memory freed again
    // cin.get();
    // cin.get();
    return 0;
}
 
char * getname()        // return pointer to new string
{
    char temp[80];      // temporary storage
    cout << "Enter last name: ";
    cin >> temp;
    char * pn = new char[strlen(temp) + 1];
    strcpy(pn, temp);   // copy string into smaller space
 
    return pn;          // temp lost when function ends
}
на основании этого листинга даётся пояснение автоматически выделяемой памяти для переменных, объявленных внутри блоков (в данной ситуации - внутри функции getname() ). Речь о том что указатель pn объявляется для того, чтоб не потерять значение вводимой строки.
Тут возникает вопрос: почему значение символьного массива удаляется при выходе из функции, а значение области памяти, на которую указывает вышеупомянутый pn остаётся?
Сразу второй вопрос: почему не передать функции значение массива сразу через return?
И третий вопрос: если бы функция возвращала массив, то как правильно её объявить, сразу после круглых скобок с перечнем параметров ставить квадратные с количеством элементов массива?
после выхода из функции автоматически удаляются все объявленные переменные внутри функции за исключением static
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.02.2013, 16:15     Автоматические переменные #3
Стек и куча: как все это работает?
Gleb4uk
2 / 2 / 0
Регистрация: 08.08.2012
Сообщений: 58
24.02.2013, 16:40  [ТС]     Автоматические переменные #4
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
после выхода из функции автоматически удаляются все объявленные переменные внутри функции за исключением static
Насколько я понял из книги - static - ключевое слово, которое ставится перед именем типа для объявления статической переменной, и действие его равносильно объявлению переменной вне функции - такая переменная живёт, пока выполняется программа. Но в этом примере указатель объявлен внутри функции и ключевого слова static там нет.

Для начала - в листинге всё правильно? Строка не будет потеряна? А-то я в книге этой уже много нашёл огрехов, издание пестрит ошибками.
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
24.02.2013, 17:10     Автоматические переменные #5
Цитата Сообщение от Gleb4uk Посмотреть сообщение
Но в этом примере указатель объявлен внутри функции и ключевого слова static там нет.
память выделяется в куче. Если память выделяется на стеке, то она контролируется программой, а если в куче, то программистом.
Yandex
Объявления
24.02.2013, 17:10     Автоматические переменные
Ответ Создать тему
Опции темы

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