Выделение памяти для массива - 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;
}