|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||||||||||||||||
Выделение памяти для динамического двумерного массива внутри функции11.08.2017, 00:09. Показов 7824. Ответов 25
Метки нет (Все метки)
Имеется вот такой код :
Но я вот усиленно не могу понять, почему не работает такой вариант :
Ведь имя массива - и есть адрес его первого элемента и идет передача значения, которое является адресом, то есть того, что нам нужно. По крайне мере, это работает на одномерных массивах. А вот здесь - ступор. Причем работает и такой вариант функции освобождения памяти :
Около полугода назад встречался с похожим, но тогда проблему исправил методом тыка и как-то забылось. Сейчас совершенно случайно всплыло снова, причем со 2го раза также все удачно написалось, но суть проблемы я понимаю не очень. А это ведь еще даже не С++, а С, то есть совсем уже базовый уровень. Разъясните, пожалуйста, как можно подробнее, в чем же здесь кроется секрет.
0
|
||||||||||||||||
| 11.08.2017, 00:09 | |
|
Ответы с готовыми решениями:
25
Выделение памяти для двухмерного массива внутри функции
Выделение памяти для двумерного массива |
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|||||||||||||
| 11.08.2017, 00:26 | |||||||||||||
Сообщение было отмечено Notoriously как решение
Решение
1
|
|||||||||||||
|
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
|
||||||
| 11.08.2017, 00:38 | ||||||
|
выделение и инициализация
0
|
||||||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||
| 11.08.2017, 00:45 [ТС] | ||
|
У меня никак не укладывается, почему передаешь указатель, значением которого является чей-то адрес, этот адрес ложится в параметр и все равно не происходит по нему выделения памяти после отработки функции. Ведь это же адрес, лежит он в оригинале или же в локальной копии. И почему freeMemory отрабатывает и при условии передачи "по значению"? Вариант с ссылкой я знаю, спасибо, насколько я понимаю, это тоже самое, что передать int ***, только не нужно внутри функции делать дополнительное разыменование.
0
|
||
| 11.08.2017, 00:45 | |
|
0
|
|
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||||||
| 11.08.2017, 00:48 [ТС] | ||||||
|
И еще есть такой вариант -
Или же память, выделенная внутри функции в куче и должна оставаться валидной?
0
|
||||||
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
||
| 11.08.2017, 00:53 | ||
|
1
|
||
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|||
| 11.08.2017, 01:00 | |||
|
1
|
|||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 11.08.2017, 01:00 [ТС] | |
|
gray_fox,
Понял. А в случае удаления, в локальную копию идет адрес, по которому идет удаление и соотвественно так как чистим то мы по переданному адресу, пусть он и лежит в копии, то по возвращению память будет чиста и под аргументом?
0
|
|
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||
| 11.08.2017, 01:01 [ТС] | ||
|
0
|
||
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
| 11.08.2017, 01:01 | |
|
1
|
|
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 11.08.2017, 01:07 [ТС] | |
|
gray_fox, nd2,
Спасибо, понял.
0
|
|
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 11.08.2017, 09:04 | ||
|
* Имя массива в рамках системы типов С++ - приводится к указателю на первый элемент, именно приводится, а не является. Это важно, чтобы не заблуждаться в дальнейшем. * Описанная ситуация на самом деле работает одинаково для всех типов, разница только в твоем конкретном восприятии наблюдаемых явлений. Т.е., чтобы быстрее добраться до истины, надо задавать себе вопрос, "что я не так понимаю?", а не "почему в языке что-то работает по-разному?". Верные вопросы - залог быстрого и верного ответа.
1
|
||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 11.08.2017, 10:15 [ТС] | |
|
DrOffset,
А чем тогда является имя массива в контексте его обычного использования? Просто адресом первого элемента, а не указателем на него? То есть оно является указателем на первый элемент лишь внутри функции при передаче туда этого массива?
0
|
|
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|||||||
| 11.08.2017, 11:05 | |||||||
int a; - a - это идентификатор переменной типа int. Т.е. о каких-либо указателях в контексте имени тут говорить не приходится. В то же время, у типа "массив" есть ограничения, связанные с копированием по значению. Поэтому существует семантика преобразования объектов такого типа в указатель. Подобные неявные преобразования мы можем определить сами для своих классов. Например можно сделать так:
a - это указатель на первый элемент.
0
|
|||||||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 11.08.2017, 20:27 [ТС] | |
|
DrOffset,
Вроде бы понятно. В данном контексте идентификатор - абстракция, связывающая область памяти с конкретным именем для более удобного к ней обращения?
0
|
|
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 11.08.2017, 23:15 | ||
|
Но я не на этом внимание хотел акцентировать, а на типе. Тип у массива - "массив", а не указатель. Тип "массив" обладает определенным набором свойств и ограничений, и преобразование объектов в указатель - лишь одно из них. Вполне можно привести пример, когда именно тип "массив" будет определять поведение и семантику программы (например при разрешении перегрузки, или како-либо использование статический информации о размере), а не результат преобразования в указатель. Поэтому приравнивать массив к указателю, значит заведомо отметать все остальные случаи использования типа "массив". Вот это важно.
1
|
||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 12.08.2017, 01:56 [ТС] | |
|
DrOffset,
Да, я понял ошибочность рассуждений. К сожалению я не помню, чтобы даже в K & R делался акцент или хотя бы что-то говорилось о том, что это идет лишь преобразование типа. Ну или опять же, я истолоковал неверно. Спасибо.
0
|
|
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|||
| 12.08.2017, 03:00 | |||
В целом, могу посоветовать не делать выводов о С++ на основе учебников по С. Это все-таки разные языки, и поэтому во многих вопросах будут разные акценты. Если хочется верных акцентов, лучше читать стандарт. В стандарте С++, в частности, пункты: Array-to-pointer conversion, Arrays.
1
|
|||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 12.08.2017, 10:47 [ТС] | |
|
DrOffset,
Хорошо, спасибо, прочитаю. Действительно полезная информация, так как до этого я на нее не натыкался ни в одном из учебников. Правда, пока что большинство из них и правда было по C.
0
|
|
| 12.08.2017, 10:47 | |
|
Помогаю со студенческими работами здесь
20
Динамическое выделение памяти для двумерного массива
Вызов функции динамического выделение памяти Инициализация двумерного динамического массива внутри программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|