#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 ( "\n Type number of stacks: " ) ; if ( ( scanf ( "%d" , & N
) == 0 ) || ( N
< 3 ) ) { }
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 ( "\n Type size of stack number %d: " , i
) ; if ( ( scanf ( "%d" , & size
) == 0 ) || ( size
< 2 ) ) { printf ( "\n Error. 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 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCAqKnBvaW50ZXJzOwogICAgaW50ICphcnJheTsKICAgIGludCAqc2l6ZXM7CiAgICBpbnQgc3RhY2tzX251bWJlcjsKfSBTdGFja3NfYXJyYXk7Cgp2b2lkIGluaXRfYXJyYXkoU3RhY2tzX2FycmF5ICphcnJheSkgewogICAgLy8g0JLQstC+0LQg0YfQuNGB0LvQsCDRgdGC0LXQutC+0LIKICAgIGludCBOOwogICAgcHJpbnRmKCJcblR5cGUgbnVtYmVyIG9mIHN0YWNrczogIik7CiAgICBpZiAoKHNjYW5mKCIlZCIsICZOKSA9PSAwKSB8fCAoTiA8IDMpKXsKICAgICAgICBwcmludGYoIlxuRXJyb3IuXG4gIik7CiAgICAgICAgZXhpdCgtMSk7CiAgICB9CiAgICBhcnJheS0+c3RhY2tzX251bWJlciA9IE47CgogICAgLy8g0JLQstC+0LQg0L3QsNGH0LDQu9GM0L3Ri9GFINGA0LDQt9C80LXRgNC+0LIg0YHRgtC10LrQvtCyLgogICAgYXJyYXktPnBvaW50ZXJzID0gbWFsbG9jKHNpemVvZigqYXJyYXktPnBvaW50ZXJzKSAqIE4pOwogICAgLy8g0KXRgNCw0L3QuNC8INGA0LDQt9C80LXRgNGLINC00LvRjyDQutCw0LbQtNC+0LPQviDRgdGC0LXQutCwLgogICAgYXJyYXktPnNpemVzID0gbWFsbG9jKHNpemVvZigqYXJyYXktPnNpemVzKSAqIE4pOwoKICAgIGludCB0b3RhbF9zaXplID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgaW50IHNpemU7CiAgICAgICAgcHJpbnRmKCJcblR5cGUgc2l6ZSBvZiBzdGFjayBudW1iZXIgJWQ6ICIsIGkpOwogICAgICAgIGlmICgoc2NhbmYoIiVkIiwgJnNpemUpID09IDApIHx8ICggc2l6ZSA8IDIpKSB7CiAgICAgICAgICAgIHByaW50ZigiXG5FcnJvci4gVHJ5IGFnYWluLlxuICIpOwogICAgICAgICAgICBpLS07CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgYXJyYXktPnNpemVzW2ldID0gc2l6ZTsKICAgICAgICB0b3RhbF9zaXplICs9IHNpemU7CiAgICB9CiAgICAvLyDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQvNCw0YHRgdC40LLQsAogICAgYXJyYXktPmFycmF5ID0gbWFsbG9jKHNpemVvZigqYXJyYXktPmFycmF5KSAqIHRvdGFsX3NpemUpOwoKICAgIC8vINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10Lwg0YPQutCw0LfQsNGC0LXQu9C4LgogICAgcHJpbnRmKCJEYXRhIGFyZWE6ICVwXG4iLCAodm9pZCAqKWFycmF5LT5hcnJheSk7CiAgICBpbnQgb2Zmc2V0ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgYXJyYXktPnBvaW50ZXJzW2ldID0gYXJyYXktPmFycmF5ICsgb2Zmc2V0OwogICAgICAgIHByaW50Zigic3RhY2sgJWk6ICVwXG4iLCBpLCAodm9pZCAqKWFycmF5LT5wb2ludGVyc1tpXSk7CiAgICAgICAgb2Zmc2V0ICs9IGFycmF5LT5zaXplc1tpXTsKICAgIH0KfQoKaW50IG1haW4odm9pZCkgewogICAgU3RhY2tzX2FycmF5IGFycmF5OwogICAgaW5pdF9hcnJheSgmYXJyYXkpOwogICAgcmV0dXJuIDA7Cn0K