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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
sterkh
5 / 5 / 1
Регистрация: 06.04.2013
Сообщений: 99
#1

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

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

Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 18:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? (C++):

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

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

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

Как задать размеры массива пользователем, не используя динамическое выделение памяти - C (СИ)
хм...интересный "финт ушами": #include <stdio.h> #include <stdlib.h> int main() { int n, m, i, j; puts("Enter n and...

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

Неправильное выведение памяти для динамического массива - C++
Написал несложную программу. Когда в одном объекте вывожу динамический массив другого вложенного объекта, выдает ошибку в этих строках ...

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

Чтобы у тебя не сложилось ошибочное мнение, что, мол, я не согласен и везде хочу писать ссылки - сразу скажу: это не так. Всего лишь хотел подчеркнуть, что тема весьма спорная и, принимая это во внимание, так однозначно утверждать про "плохо" или "хорошо" нельзя.
Что касается моего мнения на сложившуюся ситуацию, то оно совпадает с первым ответом вот здесь.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.08.2014, 02:26 #15
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче. Если в функцию передается адрес, то объект может быть её изменен. В остальных случаях, будь то передача по константной ссылке или же по значение, - объект не изменяется. Не нужно будет лишний раз лезть в заголовок за прототипом. Поэтому, я бы отдал предпочтение вот этому соглашению:
http://google-styleguide.googlecode....ence_Arguments
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2014, 02:26
Привет! Вот еще темы с ответами:

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

Выделение памяти для массива - C++
верно ли выделил память для массива если нет поправьте, заранее спасибо) class type { private: int ***p; int x, y, z; public: ...

Выделение памяти для массива - C++
Пишу такой код: int main() { int* arr1 = new int; } Всё норм. Теперь такой:

Выделение памяти для массива - C (СИ)
на вид все просто, а на деле что то не очень =( Выделить память для трехмерного массива а. Изменить индексы начального элемента...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.08.2014, 02:26
Ответ Создать тему
Опции темы

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