Выделение памяти для массива - C (СИ)
Формулировка задачи:
на вид все просто, а на деле что то не очень =(
Выделить память для трехмерного массива а[3][4][5]. Изменить индексы начального элемента массива на [3][-3][3]. Протестировать программу.
Решение задачи: «Выделение памяти для массива»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> /* array index shifts ТОЛЬКО для ознакомления в учебных целях. В реальных проектах не повторять и все такое. Комментировать не буду. */ int*** ptr_make(int iz, int jz, int kz) { int*** ptr; size_t jj; ptr = (int***)malloc(iz*sizeof(int**)); while(iz) { --iz; ptr[iz] = (int**)malloc(jz*sizeof(int*)); jj = jz; while(jj) { --jj; ptr[iz][jj] = (int*)malloc(kz*sizeof(int)); } } return ptr; } void ptr_free(int*** ptr, int iz, int jz, int kz) { while(iz) { --iz; kz = jz; while(kz) { --kz; free(ptr[iz][kz]); } free(ptr[iz]); } free(ptr); } int*** ptr_shift(int*** ptr, int iz, int jz, int kz, int i, int j,int k) { while(iz) { --iz; kz = jz; while(kz) { --kz; ptr[iz][kz]-= k; } ptr[iz]-= j; } ptr -= i; return ptr; } int*** ptr_unshift(int*** ptr, int iz, int jz, int kz, int i, int j,int k) { ptr += i; while(iz) { --iz; ptr[iz]+= j; kz = jz; while(kz) { --kz; ptr[iz][kz]+= k; } } return ptr; } void ptr_test() { int*** a; const int iz = 3, jz = 4, kz = 5; // размеры const int is = 3,js = -3, ks = 3; // сдвиги(по фазе[/sarcasm]) int ***i, **j, *k; a = ptr_make(iz, jz, kz); a = ptr_shift(a, iz, jz, kz, is, js, ks); // я не хочу использовать ТАКИЕ индексы, поэтому через указатели for(i = a + is; i != (a + is + iz); ++i) { for(j = *i + js; j != (*i + js + jz); ++j) { for(k = *j + ks; k != (*j + ks + kz); ++k) { *k = rand()%100; } } } // Вывод делать лень a = ptr_unshift(a, iz, jz, kz, is, js, ks); ptr_free(a, iz, jz, kz); } int main(void) { ptr_test(); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д