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

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

10.08.2014, 18:00. Показов 3347. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.08.2014, 00:42
Цитата Сообщение от Toshkarik Посмотреть сообщение
Передавать по не-const ссылке - плохо.
Твое мнение, чем?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2014, 00:44
Очевидно же, что неочевидно
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru