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

Выделить память под двумерный массив за один вызов функции malloc - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задачка по матрицам (вывести номер строчки в которой количество положительных елементов самая большая) http://www.cyberforum.ru/cpp-beginners/thread865344.html
для матрицы С(20,20) вывести номер строчки в которой количество положительных елементов самая большая
C++ Блок-схема (Visio) Найти наименьший элемент матрицы A(n x m) и номер строки и столбца, в которых он находится. Эту строку заполнить значениями наибольшего элемента матрицы. Примечание: Если размерность массива не указана, то число строк и столбцов вводится пользователем. В этом случае резервируется массив размером 10 x 10. Алгоритм должен ввести количество строк или столбцов >10 и <2. http://www.cyberforum.ru/cpp-beginners/thread865339.html
C++ Натолкните на ошибку
Составить программу для вычисления значений функции F(x) на отрезке с шагом h. Результат представить в виде таблицы, первый столбец которой — значения аргумента, второй — соответствующие значения функции. Сама функция: F(х) = 1/2 * sin(х/4) +1. К примеру ввожу а = 0, b = 5 и h = 1, постоянно выводится значение функции 1. Программу делал в вижуал студио 2010. Вот код: #include "stdafx.h"...
Очереди и стеки C++
#include "stdafx.h" #include "iostream" using namespace std; struct stack { int x; stack *Next,*Head; };
C++ Для каждой половины матрицы вычислить и вывести количество положительных элементов http://www.cyberforum.ru/cpp-beginners/thread865322.html
В матрице А (m столбцов и n строк n-четное) для каждой ее половины (верхней и нижней) вычислить и вывести кол-во положительных элементов. Та к же определить , в какой из этих половин среднее арифметическое значение прочих элементов имеет большую величину (Вывести одно из сообщений "Больше в верхней" "больше в нижней" или "одинаково". Для вычисления кол-ва положительных эл-тов и среднего...
C++ Вывести данные о школе с самым большим отношением числа поступивших к числу выпускников Дана информация о пяти школах. Структура имеет поля: номер школы, год, количество выпускников, число поступивших в вузы. Вывести данные о школе с самым большим отношением числа поступивших к числу выпускников. подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.05.2013, 23:31     Выделить память под двумерный массив за один вызов функции malloc
Как делают обычно, чтобы получить массив размера n на m:
C
1
2
3
4
5
6
7
8
9
10
11
12
int** alloc(size_t n, size_t m)
{
    // выделяем место под n указателей на одномерные массивы
    int **result = malloc(n * sizeof(*result));
 
    // каждому из них создаём по персональному массиву
    for (size_t i = 0; i < n; i++) {
        result[i] = malloc(m * sizeof(**result));
    }
 
    return result;
}
Вся фишка ведь в том, что если int **arr = alloc(n, m); то потом arr[i][j] читается как (arr[i])[j] — вытягивается указатель на нужный одномерный массив, а потом в этом массиве вытягивается нужный элемент двумерного массива.

В том варианте память под оба массива выделяется за один раз. Указателям без разницы, сколько там раз была вызвана malloc().
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int** alloc(size_t n, size_t m)
{
    // Массив из n * m интов + память на n указателей.
    void *data = malloc(n * m * sizeof(int) + n * sizeof(int*));
    
    // Первые n * sizeof(int*) байт заняты массивом указателей.
    // Остальной кусок - это двумерный массив.
    int **result = data;
    result[0] = ((int *) data) + n; // = data + n * sizeof(int*)
 
    // Этот массив не только должен существовать, но и указатели
    // в нём должны указывать куда следует. Двумерный массив n * m
    // состоит из n строк по m элементов. Если строки идут подряд, то
    // очевидно, что между i-й и 0-й находится i * sizeof(int) байт.
    for (size_t i = 0; i < n; i++) {
        result[i] = result[0] + m * i;
    }
 
    return result;
}
Статические двумерные массивы сделаны примерно так же, только с той поправкой, что количество элементов в строке фиксировано, так что можно не хранить эти лишние указатели в начале, а сразу адресовать нужный элемент подобно тому, как в посте над этим. В принципе, и в динамическом случае так можно делать, но тогда не будет сахарка arr[i][j].
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru