С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
5 / 5 / 8
Регистрация: 06.04.2013
Сообщений: 103

Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main?

10.08.2014, 18:00. Показов 3277. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2014, 18:00
Ответы с готовыми решениями:

Выделение памяти для динамического массива
Как выделить память для динамического массива так, чтобы индексация начиналась не с нуля, а с единицы?

Выделение памяти для динамического двумерного массива внутри функции
Имеется вот такой код : #include <iostream> void allocateMemory(int ***array, int size); void freeMemory(int **array, int size); ...

Использование типа void в качестве возвращаемого значения функцией main
Здравствуйте. Надеюсь получить внятный ответ на то, почему все категорически рекомендуют использовать int main(). Для примера возьмем...

40
Пес войны
 Аватар для NeonLost
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653
10.08.2014, 18:02
Цитата Сообщение от sterkh Посмотреть сообщение
Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
можно
не прийдется
1
5 / 5 / 8
Регистрация: 06.04.2013
Сообщений: 103
10.08.2014, 18:03  [ТС]
Спасибо
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 19:09
Цитата Сообщение от sterkh Посмотреть сообщение
Если выделение памяти для дин.массива задать void-функцией
Что здесь имеется в виду вообще?
0
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
10.08.2014, 19:16
Tulosba, видимо что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo(int* a, int n)
{
a = new int [n];
}
 
int main()
{
int* a;
foo(a, 5);
// работа с a - надо ли писать a = new int [5];
return 0;
}
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 19:23
CyberSolver, в таком варианте указатель на выделенную память не вернется. Если хочется вернуть значение через аргумент-указатель, то уровень указателя (грубо говоря, количество звездочек *) должен быть на 1 больше, чем тип обрабатываемого объекта. Т.е.
C++
1
2
3
4
5
6
7
void foo(int** a, int n)
{
   *a = new int [n];
}
...
int* a;
foo( &a, 5 );
2
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
10.08.2014, 19:36
Tulosba, ключевыми словами были «что-то типа». И если бы человек написал ваш код, то и вопроса бы не возникло, верно?
0
5 / 5 / 8
Регистрация: 06.04.2013
Сообщений: 103
10.08.2014, 20:42  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
void freeb(int ***b, int n){
    int i;
    *b = (int**)calloc(n, sizeof(int*));
    for (int i = 0; i < n; i++) {
        *b[i] = (int*)calloc(n, sizeof(int));
    }
}
 
int **b;
freeb(&b,n);
То есть вот так будет выглядеть для двумерного массива nxn?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 23:39
Цитата Сообщение от sterkh Посмотреть сообщение
То есть вот так будет выглядеть для двумерного массива nxn?
Если опираться на сишные функции, то что-то в этом духе.
1
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
11.08.2014, 00:00
Лучший ответ Сообщение было отмечено sterkh как решение

Решение

sterkh, а если опираться на С++, то лучше передать ссылку на указатель
C++
1
2
3
4
void freeb(int *&b, int n)
{
    // здесь можно присваивать укзателю
}
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2014, 00:16
Лучше уж возвращать указатель. Передавать по не-const ссылке - плохо.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.08.2014, 00:42
Цитата Сообщение от Toshkarik Посмотреть сообщение
Передавать по не-const ссылке - плохо.
Твое мнение, чем?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2014, 00:44
Очевидно же, что неочевидно
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.08.2014, 01:38
Цитата Сообщение от Toshkarik Посмотреть сообщение
Очевидно же, что неочевидно
Это спорно.
Довод, что, мол, понятно становится по операции взятия адреса, что внутри функции объект изменяется в большинстве случаев рассыпается о факт того, что программисту все равно придется смотреть определение (хотя бы чтобы выяснить константность указателя). А раз он посмотрел определение, то ссылка там или указатель уже не важно - программист уже все понял.

Чтобы у тебя не сложилось ошибочное мнение, что, мол, я не согласен и везде хочу писать ссылки - сразу скажу: это не так. Всего лишь хотел подчеркнуть, что тема весьма спорная и, принимая это во внимание, так однозначно утверждать про "плохо" или "хорошо" нельзя.
Что касается моего мнения на сложившуюся ситуацию, то оно совпадает с первым ответом вот здесь.
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2014, 02:26
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче. Если в функцию передается адрес, то объект может быть её изменен. В остальных случаях, будь то передача по константной ссылке или же по значение, - объект не изменяется. Не нужно будет лишний раз лезть в заголовок за прототипом. Поэтому, я бы отдал предпочтение вот этому соглашению:
http://google-styleguide.googl... _Arguments
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.08.2014, 03:20
Цитата Сообщение от Toshkarik Посмотреть сообщение
http://google-styleguide.googlecode....ence_Arguments
Когда участвовал в разработке яндекс.браузера приходилось следовать всем этим стайл-гайдам. Жутко припекало в особенности от этого правила. Нафига передавать что-то по указателю, когда можно передать это по ссылке. Ведь и в том и в другом случае очевидно, что объект может быть изменен. Пояснение просто убивает: "References can be confusing, as they have value syntax but pointer semantics". Для кого они confusing, для C'шников что-ли, которые в первый раз ссылки увидели?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2014, 03:30
Множество людей - множество стилей. Если каждый будет писать как захочет, то будет хаос. Для больших проектов это неприемлемо. Да что там больших, для средних даже. Это мое мнение.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.08.2014, 03:33
Да очевидно, что надо придерживаться установленных правил, даже если они совершенно не по душе. Мне интересна была аргументация по тому конкретному правилу. Те доводы, которые приводит гугл, по мне так скажем весьма не убедительны
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2014, 03:41
Ну мне тоже думается, что основной причиной являются C'шники. Даже не сами C`шники, сколько сам C, который все еще используется в перемешку с C++. Видел его где то в исходниках Chromium`а.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.08.2014, 08:37
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче.
Лично я постоянно смотрю большой код. Большая часть моей работы сводится к рефакторингу и сопровождению большого количества legacy кода. И по опыту скажу, что в прототип нужно лазить постоянно. Это соглашение не работает в моем случае. Т.к. по нему нельзя отличить константный указатель от неконстантного (я об этом уже писал выше).

Не по теме:

В гуглекстати решили эту проблему просто сделав запись const T * менее предпочтительной.

Remember that most of the time input parameters are going to be specified as const T&.
Но их гайдлайн точно подходит далеко не для всех типов контор.


Это происходит хотя бы потому, что код, особенно такой старый (в смысле с большой историей), как в моем случае, не обязательно написан одной и той же командой (и не обязательно из одной и той же организации). Следовательно запросто могут быть разные гайдлайны (и это часто действительно так: в одной части системы серьезный ООП и полиморфизм, в другой С стиль и процедурное программирование - и вот одна часть кода вызывает другую). Следовательно, в общем случае никаких гарантий нет.

Опять же, я не спорю с тобой. Цель поста показать, что есть еще и другие ситуации. Их надо учитывать когда делается общий вывод.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2014, 08:37
Помогаю со студенческими работами здесь

Как задать размеры массива пользователем, не используя динамическое выделение памяти
хм...интересный &quot;финт ушами&quot;: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int n, m, i, j; puts(&quot;Enter n...

Прошу объяснить, почему перед функцией main, которая ничего не возращает, мы должны писать int, а не void?
Как пример: }#include &lt;stdio.h&gt; * ... main() { float fahr, celsius; * int lower, upper, step; * * * * lower = 0;

что плохого если я делаю ф-ю main типа void
привет всем, кто может объяснить, что плохого если я делаю ф-ю main типа void ?

Как в отдельной функции выделить память для динамического массива, объявленного в main
Доброго времени суток. Передо мной стоит задача выделения памяти для динамического массива в отдельной функции. То есть я объявляю в...

Вызов функции динамического выделение памяти
Здравствуйте! Нужна помощь! Написал функцию выделение памяти под двумерный динамический массив, которая возвращает масив размером...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru