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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д