fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5. int **pointers;
  6. int *array;
  7. int *sizes;
  8. int stacks_number;
  9. } Stacks_array;
  10.  
  11. void init_array(Stacks_array *array) {
  12. // Ввод числа стеков
  13. int N;
  14. printf("\nType number of stacks: ");
  15. if ((scanf("%d", &N) == 0) || (N < 3)){
  16. printf("\nError.\n ");
  17. exit(-1);
  18. }
  19. array->stacks_number = N;
  20.  
  21. // Ввод начальных размеров стеков.
  22. array->pointers = malloc(sizeof(*array->pointers) * N);
  23. // Храним размеры для каждого стека.
  24. array->sizes = malloc(sizeof(*array->sizes) * N);
  25.  
  26. int total_size = 0;
  27. for (int i = 0; i < N; i++) {
  28. int size;
  29. printf("\nType size of stack number %d: ", i);
  30. if ((scanf("%d", &size) == 0) || ( size < 2)) {
  31. printf("\nError. Try again.\n ");
  32. i--;
  33. continue;
  34. }
  35.  
  36. array->sizes[i] = size;
  37. total_size += size;
  38. }
  39. // Инициализация массива
  40. array->array = malloc(sizeof(*array->array) * total_size);
  41.  
  42. // Инициализируем указатели.
  43. printf("Data area: %p\n", (void *)array->array);
  44. int offset = 0;
  45. for (int i = 0; i < N; i++) {
  46. array->pointers[i] = array->array + offset;
  47. printf("stack %i: %p\n", i, (void *)array->pointers[i]);
  48. offset += array->sizes[i];
  49. }
  50. }
  51.  
  52. int main(void) {
  53. Stacks_array array;
  54. init_array(&array);
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 2304KB
stdin
3
4
5
6
stdout
Type number of stacks: 
Type size of stack number 0: 
Type size of stack number 1: 
Type size of stack number 2: Data area: 0x841e028
stack 0: 0x841e028
stack 1: 0x841e038
stack 2: 0x841e04c