Ошибка передачи указателя на выделенную память - C (СИ)

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

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

Ситуация следующая, при первом добавлении элемента все хорошо, как только добавляю второй элемент сразу же вылетает из программы, т е когда вызывается reMemory! Скорее всего что то намудрил с указателями, долго разбирался, но ничего не вышло, может кто подскажет что не так? Заранее спасибо)
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. struct comp {
  6. char firm[7];
  7. char model[7];
  8. int memory;
  9. char proc[15];
  10. char card[10];
  11. int screenX;
  12. int screenY;
  13. int hd;
  14. double price;
  15. };
  16. void addDate(struct comp**,int*);
  17. void printDate(struct comp*,int);
  18. void setMemory(struct comp**,int*);
  19. void reMemory(struct comp**,int*);
  20. int main(int argc, char *argv[])
  21. {
  22. int n = 0;
  23. struct comp* array = NULL;
  24. char c;
  25. do{
  26. system("CLS");
  27. printf("===============================================================================\n");
  28. printf(" MENU \n");
  29. printf("===============================================================================\n");
  30. printf("0. Add date \n");
  31. printf("1. View catalog \n");
  32. printf("Exit - ESC \n");
  33. c = getch();
  34. switch (c){
  35. case '0': addDate(&array,&n); break;
  36. case '1': printDate(array,n); break;
  37. default: break;
  38. }
  39. } while (c != 27);
  40. return 0;
  41. }
  42. void addDate(struct comp** arry, int *n)
  43. {
  44. if((*n) == 0)
  45. {
  46. setMemory(arry,n);
  47. }
  48. else {
  49. reMemory(arry,n);
  50. }
  51. struct comp poss;
  52. system("cls");
  53. printf("===============================================================================\n");
  54. printf(" Add Element \n");
  55. printf("===============================================================================\n");
  56. printf("Firma: "); scanf("%s", &poss.firm);
  57. printf("Model: "); scanf("%s", &poss.model);
  58. printf("memory(mb): "); scanf("%i", &poss.memory);
  59. printf("Prozessor: "); scanf("%s", &poss.proc);
  60. printf("card: "); scanf("%s", &poss.card);
  61. printf("ScreenX: "); scanf("%i", &poss.screenX);
  62. printf("ScreenY: "); scanf("%i", &poss.screenY);
  63. printf("Hd: "); scanf("%i", &poss.hd);
  64. printf("Price: "); scanf("%lf",&poss.price);
  65. *arry[(*n)-1] = poss;
  66. printf("\nClick to continue...\n");
  67. getch();
  68. }
  69.  
  70. void printDate(struct comp* arry, int n){
  71. int i;
  72. system("CLS");
  73. printf("===============================================================================\n");
  74. printf("| View catalog |\n");
  75. printf("===============================================================================\n");
  76. printf("| Firma | Model | Memory | Prozessor | Card | Screen | Hd | Price |\n");
  77. printf("===============================================================================\n");
  78. for (i = 0; i < n; i++){
  79. printf("|%7s |%7s | %4i |%15s|%10s|%4i*%4i|%4i|%8.0lf|\n",
  80. arry[i].firm,
  81. arry[i].model,
  82. arry[i].memory,
  83. arry[i].proc,
  84. arry[i].card,
  85. arry[i].screenX,
  86. arry[i].screenY,
  87. arry[i].hd,
  88. arry[i].price);
  89. }
  90. printf("\nClick to continue...\n");
  91. getch();
  92. }
  93. void setMemory(struct comp** arry, int *n){
  94. (*n)++;
  95. *arry = (struct comp*)malloc((*n)* sizeof(struct comp));
  96. }
  97. void reMemory(struct comp** arry,int *n){
  98. (*n)++;
  99. (*arry) = (struct comp *)realloc((*arry), (*n) * sizeof(struct comp));
  100. }
Кто нибудь поможет?

Решение задачи: «Ошибка передачи указателя на выделенную память»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. struct comp {
  6.     char firm[7];
  7.     char model[7];
  8.     int memory;
  9.     char proc[15];
  10.     char card[10];
  11.     int screenX;
  12.     int screenY;
  13.     int hd;
  14.     double price;
  15. };
  16.  
  17. struct comp* addDate(struct comp*,int*);
  18. void printDate(struct comp*,int);
  19. struct comp* setMemory(struct comp*,int*);
  20. struct comp* reMemory(struct comp*,int*);
  21.  
  22. int main(int argc, char *argv[])
  23. {
  24.     int n = 0;
  25.     struct comp* array = NULL;
  26.     char c;
  27.     do{
  28.         system("CLS");
  29.         printf("===============================================================================\n");
  30.         printf("                                  MENU                                         \n");
  31.         printf("===============================================================================\n");
  32.         printf("0. Add date                                                                    \n");
  33.         printf("1. View catalog                                                                \n");
  34.         printf("Exit - ESC                                                                     \n");
  35.         c = getch();
  36.    
  37.         switch (c){
  38.         case '0': array=addDate(array,&n);  break;
  39.         case '1': printDate(array,n); break;
  40.             default: break;
  41.         }
  42.     } while (c != 27);
  43.     return 0;
  44. }
  45.  
  46. struct comp* addDate(struct comp* arry, int *n)
  47. {
  48.     if((*n) == 0)
  49.     {
  50.         arry=setMemory(arry,n);  
  51.     }
  52.     else {
  53.         arry=reMemory(arry,n);
  54.     }
  55.    
  56.     struct comp poss;
  57.     system("cls");
  58.     printf("===============================================================================\n");
  59.     printf("                                   Add Element                                 \n");
  60.     printf("===============================================================================\n");
  61.     printf("Firma: ");          scanf("%s", &poss.firm);
  62.     printf("Model: ");          scanf("%s", &poss.model);
  63.     printf("memory(mb): ");     scanf("%i", &poss.memory);
  64.     printf("Prozessor: ");      scanf("%s", &poss.proc);
  65.     printf("card: ");           scanf("%s", &poss.card);
  66.     printf("ScreenX: ");        scanf("%i", &poss.screenX);
  67.     printf("ScreenY: ");        scanf("%i", &poss.screenY);
  68.     printf("Hd: ");             scanf("%i", &poss.hd);
  69.     printf("Price: ");          scanf("%lf",&poss.price);
  70.  
  71.     arry[(*n)-1] = poss;
  72.  
  73.     printf("\nClick to continue...\n");
  74.     getch();
  75.     return arry;
  76. }
  77.  
  78.  
  79. void printDate(struct comp* arry, int n){
  80.     int i;
  81.     system("CLS");
  82.     printf("===============================================================================\n");
  83.     printf("|                                View catalog                                 |\n");
  84.     printf("===============================================================================\n");
  85.     printf("| Firma  |  Model | Memory |   Prozessor   |   Card   |  Screen | Hd |  Price |\n");
  86.     printf("===============================================================================\n");
  87.     for (i = 0; i < n; i++){
  88.         printf("|%7s |%7s |   %4i |%15s|%10s|%4i*%4i|%4i|%8.0lf|\n",
  89.             arry[i].firm,
  90.             arry[i].model,
  91.             arry[i].memory,
  92.             arry[i].proc,
  93.             arry[i].card,
  94.             arry[i].screenX,
  95.             arry[i].screenY,
  96.             arry[i].hd,
  97.             arry[i].price);
  98.     }
  99.     printf("\nClick to continue...\n");
  100.     getch();
  101. }
  102.  
  103. struct comp* setMemory(struct comp* arry, int *n){
  104.     (*n)++;
  105.     arry = (struct comp*)malloc((*n)* sizeof(struct comp));
  106.     return arry;
  107. }
  108.  
  109. struct comp* reMemory(struct comp* arry,int *n){
  110.     (*n)++;                
  111.     arry = (struct comp *)realloc(arry, (*n) * sizeof(struct comp));
  112.     return arry;
  113. }

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

  1. Объяснение кода: Этот код - простая программа, которая позволяет пользователю добавлять и просматривать информацию о компьютерных компонентах. Он состоит из трех основных функций: addDate(), printDate() и menu(). Функция addDate() используется для добавления нового элемента в массив структур comp. Функция printDate() используется для отображения информации о компонентах в массиве. Функция menu() используется для отображения меню программы.
  2. Ошибка: Ошибка в этом коде возникает при попытке освободить память, выделенную для массива структур comp. В функции reMemory() указатель arry передается в функцию realloc() как аргумент. Однако, в этом коде никогда не вызывается realloc(), поэтому указатель arry никогда не используется. Это может привести к неопределенному поведению, если в другой части программы все-таки вызывается realloc(). Чтобы исправить эту ошибку, необходимо вызывать realloc() в функции reMemory().

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


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

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

6   голосов , оценка 3.667 из 5

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

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

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