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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
#1

Выделение динамической памяти указателю в локальной функции - C++

19.05.2011, 00:05. Просмотров 1268. Ответов 2
Метки нет (Все метки)

Собственно, я не до конца понимаю, что происходит, поэтому прошу если кто может как можно доходчивее пояснить. Упрощенная версия кода приблизительно такая:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
void Initialize(char * cptr)
{
  cptr = new char[100];
}
 
void main()
{
  char * ptr;
  Initialize(ptr);
  printf(ptr);//если в этой строчке что не так выбачайте, суть в том, что мы используем потом этот указатель
}
Программа вываливается во время выполнения с ошибкой. Я знаю, что после выполнения функции все переменные, обьявленые в ней удаляются, а если были изменения с переменными-параметрами, то при передачи по значению изменения производятся с локальной копией, поэтому не затрагивают оригинальные переменные. Но тут передается указатель, то есть передача же не по значение, а по указателю, то есть изменения над этой переменой производятся не над копией, а над этим же указателем. Мы выделяем указателю память и устанавливаем его на начало этого сегмента памяти.
Но программа вываливается в рантайме, значит указатель указывает в непонятно что. Что, при выходе из локальной памяти на все new в не' делается delete? Или создается копия указателя, и память выделяется ему, но оригинальный указатель разве на будет указывать на эту же память, даже если в функции создалася его локальная копия? Не совсем понимаю этот момент, поясните, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2011, 00:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение динамической памяти указателю в локальной функции (C++):

Выделение динамической памяти в функции - C++
Прив. У меня следующая проблема: Необходимо выделить память на массив символьных строк, разбив всю программу на функции. Вот код....

Выделение динамической памяти размером полученным из функции - C++
Функция ввода размера динамического массива int Kolvo(){ int x; printf("Введите количество элементов массива числом(от 1 до...

Динамическое выделение памяти указателю - C++
есть указатель Piece* p; его нужно проинцилизровать динамическим способом. чтобы было примерно так Piece* p;

Выделение памяти указателю операцией new - C++
Зачем строковому указателю на char* s1; выделять память s1=new char. Ведь при присваивании строки например "123456789" указателю...

Выделение динамической памяти - C++
Чем int *List = new int; delete List; отличается от обычного массива (int List) ? Нет, я понимаю, что создал динамическую...

Выделение динамической памяти - C++
Доброго времени суток! я начинающий программист, столкнулась с такой проблемой: выделяю память под динамический массив, например ...

2
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.05.2011, 00:16 #2
Всё дело в том, что когда мы передаём переменную в функцию по указателю, мы собираемся менять значение переменной. Поменять указатель мы не сможем (поскольку в данном случае локальным параметром буде являться указатель). А при выделении памяти нам необходимо изменить именно указатель. У вас же получается, что меняете вы всё-таки локальную переменную, т.е. указатель на тип int. Чтобы сделать то, что вы хотите, следует передавать указатель на указатель (чтобы изменить не значение по указателю, а указатель по указателю), т.е. так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void my_alloc(char **memory)
{
    *memory = new char [100];
}
 
int main()
{
    char *ptr;
 
    my_alloc(&ptr);
 
    // Работа с памятью
 
    delete [] ptr;
 
    return 0;
}
Чтобы скрыть подробности (не брать адрес указателя лишний раз), можно с тем же успехом использовать ссылки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void my_alloc(char *&memory)
{
    memory = new char [100];
}
 
int main()
{
    char *ptr;
 
    my_alloc(ptr); // Больше не надо писать &ptr
 
    // Работа с памятью
 
    delete [] ptr;
 
    return 0;
}
2
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
19.05.2011, 00:28  [ТС] #3
Спасибо большое!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2011, 00:28
Привет! Вот еще темы с ответами:

Выделение динамической памяти - C++
Доброго времени суток! Возник такой вопрос, переделываю программу, где параметры матрицы задавались константами на выделение динамический...

Выделение динамической памяти - C++
Всем доброго времени суток. Прошу помочь с задачей. Задача решена, просто нужно переделать её с выделением динамической памяти. ...

Выделение динамической памяти C++ - C++
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод,...

Выделение динамической памяти - C++
Добрый вечер. Помогите разобраться пожалуйста! Суть такова: есть файл, в нем есть данные, мне надо их оттуда считать и вывести на...


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

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

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