#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int **pointers;
    int *array;
    int *sizes;
    int stacks_number;
} Stacks_array;

void init_array(Stacks_array *array) {
    // Ввод числа стеков
    int N;
    printf("\nType number of stacks: ");
    if ((scanf("%d", &N) == 0) || (N < 3)){
        printf("\nError.\n ");
        exit(-1);
    }
    array->stacks_number = N;

    // Ввод начальных размеров стеков.
    array->pointers = malloc(sizeof(*array->pointers) * N);
    // Храним размеры для каждого стека.
    array->sizes = malloc(sizeof(*array->sizes) * N);

    int total_size = 0;
    for (int i = 0; i < N; i++) {
        int size;
        printf("\nType size of stack number %d: ", i);
        if ((scanf("%d", &size) == 0) || ( size < 2)) {
            printf("\nError. Try again.\n ");
            i--;
            continue;
        }

        array->sizes[i] = size;
        total_size += size;
    }
    // Инициализация массива
    array->array = malloc(sizeof(*array->array) * total_size);

    // Инициализируем указатели.
    printf("Data area: %p\n", (void *)array->array);
    int offset = 0;
    for (int i = 0; i < N; i++) {
        array->pointers[i] = array->array + offset;
        printf("stack %i: %p\n", i, (void *)array->pointers[i]);
        offset += array->sizes[i];
    }
}

int main(void) {
    Stacks_array array;
    init_array(&array);
    return 0;
}
