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;
}