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

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

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

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

24.02.2013, 16:04. Просмотров 998. Ответов 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?
И третий вопрос: если бы функция возвращала массив, то как правильно её объявить, сразу после круглых скобок с перечнем параметров ставить квадратные с количеством элементов массива?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 16:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Автоматические переменные (C++):

Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения - C++
Создать массив структур, каждая из которых состоит из следующих елементов: факультет, курс, группа, фамилия студента и екзаменационная...

Автоматические конвертеры стилей наименования объектов - C++
Существуют ли средства позволяющие в автоматическом режиме сконвертировать наименования переменных/функций во всем проекте из одного стиля...

Переменные,значение функции,вспомогательные переменные. - C++
1)Даны переменные A,B,C.Изменить их значения,переместив их содержимое из A-в B,B-в C,C-в A,и вывести новые значения переменных A,B,C. ...

Создать бинарное дерево, по правой ветке - переменные типа инт, по левой - 2 переменные типа чар - C++
Здравствуйте. Необходимо создать бинарное дерево, по правой ветке - переменные типа инт, по левой - 2 переменные типа чар. ругается в...

Переменные - C++
Всем привет, я знаю есть много неизвестного для меня в перменных, есть типы int, float, char, string, bool, но я так же слышал про другие,...

Переменные в c++ - C++
Помогите разобраться в теории. Так вот допустим мы создаем переменную в стеке int a; тогда в стеке где то по адресу скажем 004 выделяется...

4
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
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.02.2013, 16:15 #3
Стек и куча: как все это работает?
0
Gleb4uk
2 / 2 / 0
Регистрация: 08.08.2012
Сообщений: 58
24.02.2013, 16:40  [ТС] #4
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
после выхода из функции автоматически удаляются все объявленные переменные внутри функции за исключением static
Насколько я понял из книги - static - ключевое слово, которое ставится перед именем типа для объявления статической переменной, и действие его равносильно объявлению переменной вне функции - такая переменная живёт, пока выполняется программа. Но в этом примере указатель объявлен внутри функции и ключевого слова static там нет.

Для начала - в листинге всё правильно? Строка не будет потеряна? А-то я в книге этой уже много нашёл огрехов, издание пестрит ошибками.
0
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
24.02.2013, 17:10 #5
Цитата Сообщение от Gleb4uk Посмотреть сообщение
Но в этом примере указатель объявлен внутри функции и ключевого слова static там нет.
память выделяется в куче. Если память выделяется на стеке, то она контролируется программой, а если в куче, то программистом.
0
24.02.2013, 17:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 17:10
Привет! Вот еще темы с ответами:

Переменные - C++
Есть глобальная переменная, внутри описания функции я ее меняю ( ну то есть пишу b=i;); После вызова этой функции, другая функция будет...

Переменные - C++
Вот есть переменная: float x=100.0f Что значит в конце буква f ?

Переменные - C++
system( &quot;/*Как нибудь можно здесь использовать переменные типов STRING или CHAR?*/&quot; );

Глобальные переменные - C++
Доброго времени суток всем. У меня следующая проблема: объявляю глобально переменную типа структуры dealer* root;. Далее в коде...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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