Динамическая структура с динамическим массивом внутри - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Осваиваю динамическое выделение памяти в Си, но тут хорошенько затормозил. Первый цикл ввода выполняется, а второй доходит до ввода p[1].hello[0] и выдаёт ошибку. Кто бы мне мозги на место поставил. :>
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <malloc.h>
  5. struct complex
  6. {
  7. int x;
  8. int y;
  9. int *hello;
  10. };
  11. int main()
  12. {
  13. setlocale(LC_ALL, "rus");
  14. complex *p;
  15. int i, n;
  16. printf("Введите n: ");
  17. scanf("%d", &n);
  18. p = (complex*)malloc(sizeof(complex)*n);
  19. p->hello = ( int* ) malloc(sizeof(int)*3*n);
  20. for( i = 0; i < n; i++ )
  21. {
  22. printf("\nВведите p[%d].x = ", i);
  23. scanf("%d", &p[i].x);
  24. printf("\nВведите p[%d].y = ", i);
  25. scanf("%d", &p[i].y);
  26. printf("\nВведите p[%d].hello[0] = ", i);
  27. scanf("%d", &p[i].hello[0]);
  28. printf("\nВведите p[%d].hello[1] = ", i);
  29. scanf("%d", &p[i].hello[1]);
  30. printf("\nВведите p[%d].hello[2] = ", i);
  31. scanf("%d", &p[i].hello[2]);
  32. }
  33. for( i = 0; i < n; i++ )
  34. {
  35. printf("\n%d", p[i].x);
  36. printf("\n%d", p[i].y);
  37. printf("\n%d", p[i].hello[0]);
  38. printf("\n%d", p[i].hello[1]);
  39. printf("\n%d", p[i].hello[2]);
  40. }
  41. free(p);
  42. while(1);
  43. }

Решение задачи: «Динамическая структура с динамическим массивом внутри»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <malloc.h>
  5.  
  6. struct complex
  7. {
  8.     int x;
  9.     int y;
  10.     int *hello;
  11. };
  12.  
  13. void getmemory(complex **, int );
  14.  
  15. int main()
  16. {
  17.     setlocale(LC_ALL, "rus");
  18.    
  19.     complex *p;
  20.     int i, n;
  21.  
  22.     printf("Введите n: ");
  23.     scanf("%d", &n);
  24.    
  25.     p = (complex*)malloc(sizeof(complex)*n);
  26.     p->hello = (int *)malloc( sizeof( int ) * 3 );
  27.     for( i = 0; i < n; i++ )
  28.     {
  29.         printf("\nВведите p[%d].x = ", i);
  30.         scanf("%d", &p[i].x);
  31.         printf("\nВведите p[%d].y = ", i);
  32.         scanf("%d", &p[i].y);
  33.         printf("\nВведите p[%d].hello[0] = ", i);
  34.         scanf("%d", &p[i].hello[0]);
  35.         printf("\nВведите p[%d].hello[1] = ", i);
  36.         scanf("%d", &p[i].hello[1]);
  37.         printf("\nВведите p[%d].hello[2] = ", i);
  38.         scanf("%d", &p[i].hello[2]);
  39.     }
  40.  
  41.     for( i = 0; i < n; i++ )
  42.     {
  43.         printf("\n1. %d", p[i].x);
  44.         printf("\n2. %d", p[i].y);
  45.         printf("\nD3. %d", p[i].hello[0]);
  46.         printf("\nD4. %d", p[i].hello[1]);
  47.         printf("\nD5. %d", p[i].hello[2]);
  48.         printf("\n");
  49.     }
  50.  
  51.     free(p);
  52.  
  53.     getmemory( &p, n );
  54.  
  55.     for( i = 0; i < n; i++ )
  56.     {
  57.         printf("\n1. %d", p[i].x);
  58.         printf("\n2. %d", p[i].y);
  59.         printf("\nD3. %d", p[i].hello[0]);
  60.         printf("\nD4. %d", p[i].hello[1]);
  61.         printf("\nD5. %d", p[i].hello[2]);
  62.         printf("\n");
  63.     }
  64.  
  65.     free(p);
  66.  
  67.     while(1);
  68. }
  69.  
  70. void getmemory(complex** ptr, int size)
  71. {
  72.     int i;
  73.  
  74.     *ptr = (complex *)malloc( sizeof( complex ) * size );
  75.     (*ptr + i)->hello = (int*) malloc(sizeof(int) * 3);
  76.     for( i = 0; i < size; i++ )
  77.     {
  78.         printf("\nВведите p[%d].x = ", i);
  79.         scanf("%d", ptr[i]->x);
  80.         printf("\nВведите p[%d].y = ", i);
  81.         scanf("%d", ptr[i]->y);
  82.         printf("\nВведите p[%d].hello[0] = ", i);
  83.         scanf("%d", ptr[i]->hello[0]);
  84.         printf("\nВведите p[%d].hello[1] = ", i);
  85.         scanf("%d", ptr[i]->hello[1]);
  86.         printf("\nВведите p[%d].hello[2] = ", i);
  87.         scanf("%d", ptr[i]->hello[2]);
  88.     }
  89. }

Объяснение кода листинга программы

В этом коде определен тип структуры complex с полями x, y и динамическим массивом hello типа int. Структура используется для создания динамического массива структур с помощью функции malloc. Пользователю предлагается ввести значения для полей x, y и элементов массива hello для каждого элемента массива структур. Значения сохраняются в переменных соответствующих полей структуры. Затем выводится содержимое всех полей структуры на экран. После этого память, выделенная под массив структур, освобождается с помощью функции free. Затем снова запрашивается размер массива и выделяется память под новый массив структур с помощью функции getmemory. Затем снова запрашиваются значения для полей структуры и выводятся на экран. После этого память, выделенная под новый массив структур, освобождается с помощью функции free. В конце программы установлен бесконечный цикл, который никогда не завершается (while(1)).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы