Malloc (выделение памяти двумерному массиву) - проверить код - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, подскажите пожалуйста, есть ли логические ошибки в блоке "Выделения памяти:"? План по выделению памяти: 1. Выделяется массив указателей с кол-во элементов n (0..n-1). 2. Выделяется двумерный массив с кол-во элементов n*n (n..2n-1, 2n..3n-1, 3n..4n-1, 4n..5n-1). 3. Указатели массива указателей, указывают на адреса ячеек двумерного массива с интервалами n..2n-1, 2n..3n-1, 3n..4n-1, 4n..5n-1. Программа делает то что я думаю? Спасибо.
/* malloc.cpp */
 
#include <stdlib.h> // Местонахождение фн-ции "void *malloc(size_t size);"
#include <stdio.h> // Местонахождение фн-ции "int printf(const char *управляющая_строка, ...);"
 
typedef unsigned int un_int; // Новое имя целочисленного неотрицательного типа
static const un_int n = 4; // Указывает ШхД двумерного массива
 
int main() {
//-----------------> Выделение памяти:
 
    int **m = (int**)malloc(n*sizeof(int*) + sizeof(int)*n*n); // Выделяем память массиву указателей |*|*|*|*| + двумерному массиву |&|&|&|&|
    for (un_int i = n-1, k = 1; i+1 < n+n; ++i, ++k)
        m[i+1-n] = (int*)&m[i+1*k]; // Передаем адрес ячейки указателю с интервалом "i+1*k"
    
//-----------------> Заполнение массива числами от 0..(n*n-1):
 
    for (un_int i = 0, k = 0; i < n; ++i) {
                for (un_int j = 0; j < n; ++j, ++k)
                        m[i][j] = k;
        }
 
//-----------------> Вывод содержимого массива на консоль (терминал):
 
        for (un_int i = 0; i < n; ++i) {
                for (un_int j = 0; j < n; ++j)
                        printf("%d ", m[i][j]);
        printf("\n");
        }
 
//-----------------> Освобождение памяти:
 
    free(m);
 
//-----------------> Возврат 0 значения фн-ции main():
 
    return 0;
}

Решение задачи: «Malloc (выделение памяти двумерному массиву) - проверить код»

textual
Листинг программы
/* malloc.cpp */ // Имя файла
 
#include <stdlib.h> // Местонахождение фн-ции "void *malloc(size_t size);"
#include <stdio.h> // Местонахождение фн-ции "int printf(const char *управляющая_строка, ...);"
#include <iostream> // Местонахождение классов, фн-ций и переменных для организации ввода-вывода.
 
using namespace std; // открыть пространство имен библ. iostream
 
typedef unsigned int un_int; // Новое имя целочисленного неотрицательного типа
static const un_int len = 4, wid = 2; // Указывает ДxШ двумерного массива
static const int diff = wid - len; // Разница
 
void mem_test(int** &m) { // ----------> Фн-ция проверки указателей, которые указывают по нужным адресам до и после присвоения указателям нужных адресов (резул. выводится на консоль (терминал))
 
    for (un_int i = 0, j = wid - diff; i < len; ++i) {
        //printf("%d  ----->  ", *(&m[i]));
        cout << *(&m[i]) << "  ----->  ";
 
        for (un_int k = 0; k < wid; ++k, ++j) {
            switch (j) {
            case wid - diff:
                //printf("%d ", &m[len]);
                cout << &m[len] << " ";
                break;
 
            default:
                //printf("%d ", &m[j]);
                cout << &m[j] << " ";
            }
        }
 
        printf("\n");
    }
 
    printf("\n");
}
 
int main() {
//-----------------> Выделение памяти:
 
    int **m = (int**)malloc(len*sizeof(int*)+sizeof(int)*len*wid); // Тут я создаю массив указателей (n), и еще просто 1 длинный массив (n*n) в котором будут храниться целые числа
 
    mem_test(m);
 
    for (un_int i = len - 1, k = 1; i < len + len - 1; ++i, ++k)
        switch (i) {
        case len - 1:
            m[0] = (int*)&m[len];
            break;
 
        default:
            m[i + 1 - len] = (int*)&m[wid*k - diff];
        }
 
    mem_test(m);
 
/*
------------------------------------------------------------------
 
    Схемы (n=4):
 
------------------------------------------------------------------
 
    int **m = (int**)malloc(n*sizeof(int*) + sizeof(int)*n*n);
 
    |*|*|*|*|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|
 
------------------------------------------------------------------
 
    for (un_int i = n-1, k = 1; i+1 < n+n; ++i, ++k)
        m[i+1-n] = (int*)&m[n*k];
 
    |*| -> |&|&|&|&|
    0 ----- 4 5 6 7
 
    |*| -> |&|&|&|&|
    1 ----- 8 9 10 11
 
    |*| -> |&|&|&|&|
    2 ----- 12 13 14 15
 
    |*| -> |&|&|&|&|
    3 ----- 16 17 18 19
 
------------------------------------------------------------------
*/
 
//-----------------> Заполнение массива числами от 0..(wid*len-1):
 
    for (un_int i = 0, k = 0; i < len; ++i) {
        for (un_int j = 0; j < wid; ++j, ++k) {
            m[i][j] = k;
            //printf("%d ", &m[i][j]);
            cout << &m[i][j] << " ";
        }
 
        printf("\n");
    }
 
    printf("\n");
 
//-----------------> Вывод содержимого массива на консоль (терминал):
 
    for (un_int i = 0; i < len; ++i) {
        for (un_int j = 0; j < wid; ++j)
            printf("%d ", m[i][j]);
    printf("\n");
    }
            
//-----------------> Освобождение памяти:
 
    free(m);
 
//-----------------> Возврат 0 значения фн-ции main():
 
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы