Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15

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

17.12.2013, 09:56. Показов 7853. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Передо мной стоит задача выделения памяти для динамического массива в отдельной функции.
То есть я объявляю в main динамический массив, вызываю функцию, его инициализирующую, потом уже в main с ним работаю.
Для одномерного массива получилось так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void get_memory ( int size, double **a); // прототип функции для выделения памяти
 
#include "stdio.h"
#include <fstream>
 
using namespace std;
int main()
{
    double *arr;
    int M = 3;
    get_memory ( M , &arr ); // выделение памяти
    for ( int i = 0 ; i < M ; i++ ) 
    {
        arr[i] = i ; // Заполнение массива
    }
    ofstream out ("result.csv");
 
    for ( int i = 0 ; i < M ; i++ ) // вывод результатов
    {
        out << arr[i] << ",";
            out << "\n";
    }
    return 0;
}
 
void get_memory ( int size, double **a ) // вызов функции для выделения памяти
{
    *a = new double [size];
}
И это работает.
А вот когда я попробовал сделать для двумерного:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void get_memory_2D ( int M, int N, double ***arr_2D); // прототип функции для выделения памяти
 
#include "stdio.h"
#include <fstream>
 
using namespace std;
int main()
{
    double **arr_2D;
    int M = 3;
    int N = 3;
    get_memory_2D ( M, N, &arr_2D); // вызов функции для выделения памяти
    for ( int i = 0 ; i < M ; i++ )
    {
        for ( int j = 0 ; i < N ; j++ )
        {
            arr_2D[i][j] = i * ( j + 1 ); // Заполнение массива
        }
    }
    ofstream out ("result1.csv");
 
    for ( int i = 0 ; i < M ; i++ ) // вывод результатов
    {
        for ( int j = 0 ; i < N ; j++ )
        {
            out << arr_2D[i][j] << ",";
        }
        out << "\n";
    }
    return 0;
}
 
void get_memory_2D ( int M, int N, double ***arr_2D )
{
    **arr_2D = new double [M];
    for ( int i = 0 ; i < M ; i++ )
    {
    *arr_2D[i] = new double [N];
    }
}
, то программа успешно откомпиллировалась, но при выполнении возникло необработанное исключение "нарушение прав доступа при записи".
Почему под одномерный массив получается так выделять память, а под массивы большей размерности - нет?
Может, я что-то не то передаю в функцию, в качестве аргументов?
Можно решить задачу стоящую передо мной как-то по-другому?
Буду признателен, если порекомендуете литературу по этому вопросу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2013, 09:56
Ответы с готовыми решениями:

Как выделить память для динамического массива?
Как выделить память для динамического массива? typedef TPrimitives *TPrimitive; //... TPrimitives Primitives; Мне нужно выделить...

Создание динамического массива в отдельной функции
Здравствуйте. Объясните пожалуйста, почему для создания динамического массива в функции мы должны передавать адресс массива, а при очистке...

Проверка объявленного но неиспользующегося динамического массива
Объявлен динамический массив Public arr() . Требуется в условном операторе проверить использовался ли он ранее? Я пытаюсь...

9
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
17.12.2013, 10:01
Цитата Сообщение от Дима С Посмотреть сообщение
**arr_2D = new double [M];
* * for ( int i = 0 ; i < M ; i++ )
* * {
* * *arr_2D[i] = new double [N];
* * }
Не
C++
1
**arr_2D = new double [M];
а
C++
1
**arr_2D = new *double [M];
Выделять нужно не массив double а массив указателей на double (т.е. на массивы).
0
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 10:12  [ТС]
Тогда ругается компиллятор. Может, что-то другое надо передавать в функцию выделения памяти в качестве аргумента?
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
17.12.2013, 10:16
Я не знаю как это делается на С++, я так только на С делал, на С++ есть вектор и париться не надо. Причем, замечу, суть таже что на сях, что на плюсах.
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
17.12.2013, 10:44
C++
1
2
3
4
5
6
7
8
void get_memory_2D ( int M, int N, double ***arr_2D )
{
    (*arr_2D) = new double* [M];
    for ( int i = 0 ; i < M ; i++ )
    {
     (*arr_2D)[i] = new double [N];
    }
}
Добавлено через 3 минуты
Еще внутренние циклы исправьте (у Вас написано i<N)
C++
1
for ( int j = 0 ; j < N ; j++ )
1
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 10:45  [ТС]
Тогда компиллируется, а при выполнении выдаётся "Run-Time Check Failure #3 - The variable 'arr_2D' is being used without being initialized".
Получается, нельзя передавать не инициализированный массив?
А как инициализировать массив, не выделив память?
При моём необходимом условии выделения памяти в отдельной функции получается "circulus vitiosus"?
Но ведь одномерный случай работает.
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
17.12.2013, 10:49
Цитата Сообщение от Дима С Посмотреть сообщение
а при выполнении выдаётся "Run-Time Check Failure #3 - The variable 'arr_2D' is being used without being initialized".
Я поправил эту ошибку. Замените код еще раз.
1
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 11:02  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Я поправил эту ошибку. Замените код еще раз.
Спасибо огромное. Не посоветуете, что надо почитать, чтобы самому мочь написать правильно?)
Тяжело у меня с пониманием этих звёздочек, скобочек и амперсандов.
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
17.12.2013, 11:08
Да ничего читать не надо.
Запомните только, что операция &x - дает адрес переменной x
*x - дает значение, которое хранится по адресу x.
И еще надо не забывать, что при передаче параметра по значению
передается копия (поэтому мой первый предложенный вариант не сработал).
0
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 11:08  [ТС]
И чтобы я сам смог такой трёхмерный массив создать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2013, 11:08
Помогаю со студенческими работами здесь

В отдельной функции организовать подсчет суммы элементов динамического массива, которые удовлетворяют условию
Составить программу, в которой сформировать прямоугольную таблицу С из n×m целых чисел в динамической памяти, в отдельной функции...

Как выделить память для двухмерного массива?
Как выделить память для двухмерного массива в С++ a=new int???

Как выделить память для массива структур?
выделить пямять для такой структуры на n элементов typedef struct coordinates { float x; float y; float z;}line_segment;

Как динамически выделить память для строкового массива?
Собственно сам вопрос.

Как выделить память для двумерного массива указателей в куче?
Есть массив вида: unsigned char *ddtКак выделить память для такого массива в куче? Должен получиться двумерный массив указателей. Сами...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru