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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
sterkh
5 / 5 / 1
Регистрация: 06.04.2013
Сообщений: 99
10.08.2014, 18:00     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #1
Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 18:00     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main?
Посмотрите здесь:

Выделение памяти для массива через функцию и использование этого массива C++
Вызов функции динамического выделение памяти C++
что плохого если я делаю ф-ю main типа void C++
Сколько памяти необходимо для динамического хранения массива из 5 элементов C++
Выделение памяти для массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
10.08.2014, 18:02     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #2
Цитата Сообщение от sterkh Посмотреть сообщение
Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
можно
не прийдется
sterkh
5 / 5 / 1
Регистрация: 06.04.2013
Сообщений: 99
10.08.2014, 18:03  [ТС]     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #3
Спасибо
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 19:09     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #4
Цитата Сообщение от sterkh Посмотреть сообщение
Если выделение памяти для дин.массива задать void-функцией
Что здесь имеется в виду вообще?
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
10.08.2014, 19:16     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #5
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;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 19:23     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #6
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 );
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
10.08.2014, 19:36     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #7
Tulosba, ключевыми словами были «что-то типа». И если бы человек написал ваш код, то и вопроса бы не возникло, верно?
sterkh
5 / 5 / 1
Регистрация: 06.04.2013
Сообщений: 99
10.08.2014, 20:42  [ТС]     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #8
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?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 23:39     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #9
Цитата Сообщение от sterkh Посмотреть сообщение
То есть вот так будет выглядеть для двумерного массива nxn?
Если опираться на сишные функции, то что-то в этом духе.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
11.08.2014, 00:00     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
sterkh, а если опираться на С++, то лучше передать ссылку на указатель
C++
1
2
3
4
void freeb(int *&b, int n)
{
    // здесь можно присваивать укзателю
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.08.2014, 00:16     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #11
Лучше уж возвращать указатель. Передавать по не-const ссылке - плохо.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
11.08.2014, 00:42     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
Передавать по не-const ссылке - плохо.
Твое мнение, чем?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.08.2014, 00:44     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #13
Очевидно же, что неочевидно
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
11.08.2014, 01:38     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Очевидно же, что неочевидно
Это спорно.
Довод, что, мол, понятно становится по операции взятия адреса, что внутри функции объект изменяется в большинстве случаев рассыпается о факт того, что программисту все равно придется смотреть определение (хотя бы чтобы выяснить константность указателя). А раз он посмотрел определение, то ссылка там или указатель уже не важно - программист уже все понял.

Чтобы у тебя не сложилось ошибочное мнение, что, мол, я не согласен и везде хочу писать ссылки - сразу скажу: это не так. Всего лишь хотел подчеркнуть, что тема весьма спорная и, принимая это во внимание, так однозначно утверждать про "плохо" или "хорошо" нельзя.
Что касается моего мнения на сложившуюся ситуацию, то оно совпадает с первым ответом вот здесь.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.08.2014, 02:26     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #15
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче. Если в функцию передается адрес, то объект может быть её изменен. В остальных случаях, будь то передача по константной ссылке или же по значение, - объект не изменяется. Не нужно будет лишний раз лезть в заголовок за прототипом. Поэтому, я бы отдал предпочтение вот этому соглашению:
http://google-styleguide.googlecode....ence_Arguments
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
11.08.2014, 03:20     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
http://google-styleguide.googlecode....ence_Arguments
Когда участвовал в разработке яндекс.браузера приходилось следовать всем этим стайл-гайдам. Жутко припекало в особенности от этого правила. Нафига передавать что-то по указателю, когда можно передать это по ссылке. Ведь и в том и в другом случае очевидно, что объект может быть изменен. Пояснение просто убивает: "References can be confusing, as they have value syntax but pointer semantics". Для кого они confusing, для C'шников что-ли, которые в первый раз ссылки увидели?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.08.2014, 03:30     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #17
Множество людей - множество стилей. Если каждый будет писать как захочет, то будет хаос. Для больших проектов это неприемлемо. Да что там больших, для средних даже. Это мое мнение.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
11.08.2014, 03:33     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #18
Да очевидно, что надо придерживаться установленных правил, даже если они совершенно не по душе. Мне интересна была аргументация по тому конкретному правилу. Те доводы, которые приводит гугл, по мне так скажем весьма не убедительны
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.08.2014, 03:41     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #19
Ну мне тоже думается, что основной причиной являются C'шники. Даже не сами C`шники, сколько сам C, который все еще используется в перемешку с C++. Видел его где то в исходниках Chromium`а.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2014, 08:37     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main?
Еще ссылки по теме:

C++ Как в отдельной функции выделить память для динамического массива, объявленного в main
Выделение памяти для массива C++
Выделение памяти для массива C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
11.08.2014, 08:37     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче.
Лично я постоянно смотрю большой код. Большая часть моей работы сводится к рефакторингу и сопровождению большого количества legacy кода. И по опыту скажу, что в прототип нужно лазить постоянно. Это соглашение не работает в моем случае. Т.к. по нему нельзя отличить константный указатель от неконстантного (я об этом уже писал выше).

Не по теме:

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

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


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

Опять же, я не спорю с тобой. Цель поста показать, что есть еще и другие ситуации. Их надо учитывать когда делается общий вывод.
Yandex
Объявления
11.08.2014, 08:37     Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main?
Ответ Создать тему
Опции темы

Текущее время: 11:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru