Ошибка передачи указателя на выделенную память - C (СИ)
Формулировка задачи:
Ситуация следующая, при первом добавлении элемента все хорошо, как только добавляю второй элемент сразу же вылетает из программы, т е когда вызывается reMemory! Скорее всего что то намудрил с указателями, долго разбирался, но ничего не вышло, может кто подскажет что не так?
Заранее спасибо)
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> struct comp { char firm[7]; char model[7]; int memory; char proc[15]; char card[10]; int screenX; int screenY; int hd; double price; }; void addDate(struct comp**,int*); void printDate(struct comp*,int); void setMemory(struct comp**,int*); void reMemory(struct comp**,int*); int main(int argc, char *argv[]) { int n = 0; struct comp* array = NULL; char c; do{ system("CLS"); printf("===============================================================================\n"); printf(" MENU \n"); printf("===============================================================================\n"); printf("0. Add date \n"); printf("1. View catalog \n"); printf("Exit - ESC \n"); c = getch(); switch (c){ case '0': addDate(&array,&n); break; case '1': printDate(array,n); break; default: break; } } while (c != 27); return 0; } void addDate(struct comp** arry, int *n) { if((*n) == 0) { setMemory(arry,n); } else { reMemory(arry,n); } struct comp poss; system("cls"); printf("===============================================================================\n"); printf(" Add Element \n"); printf("===============================================================================\n"); printf("Firma: "); scanf("%s", &poss.firm); printf("Model: "); scanf("%s", &poss.model); printf("memory(mb): "); scanf("%i", &poss.memory); printf("Prozessor: "); scanf("%s", &poss.proc); printf("card: "); scanf("%s", &poss.card); printf("ScreenX: "); scanf("%i", &poss.screenX); printf("ScreenY: "); scanf("%i", &poss.screenY); printf("Hd: "); scanf("%i", &poss.hd); printf("Price: "); scanf("%lf",&poss.price); *arry[(*n)-1] = poss; printf("\nClick to continue...\n"); getch(); } void printDate(struct comp* arry, int n){ int i; system("CLS"); printf("===============================================================================\n"); printf("| View catalog |\n"); printf("===============================================================================\n"); printf("| Firma | Model | Memory | Prozessor | Card | Screen | Hd | Price |\n"); printf("===============================================================================\n"); for (i = 0; i < n; i++){ printf("|%7s |%7s | %4i |%15s|%10s|%4i*%4i|%4i|%8.0lf|\n", arry[i].firm, arry[i].model, arry[i].memory, arry[i].proc, arry[i].card, arry[i].screenX, arry[i].screenY, arry[i].hd, arry[i].price); } printf("\nClick to continue...\n"); getch(); } void setMemory(struct comp** arry, int *n){ (*n)++; *arry = (struct comp*)malloc((*n)* sizeof(struct comp)); } void reMemory(struct comp** arry,int *n){ (*n)++; (*arry) = (struct comp *)realloc((*arry), (*n) * sizeof(struct comp)); }
Кто нибудь поможет?
Решение задачи: «Ошибка передачи указателя на выделенную память»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> struct comp { char firm[7]; char model[7]; int memory; char proc[15]; char card[10]; int screenX; int screenY; int hd; double price; }; struct comp* addDate(struct comp*,int*); void printDate(struct comp*,int); struct comp* setMemory(struct comp*,int*); struct comp* reMemory(struct comp*,int*); int main(int argc, char *argv[]) { int n = 0; struct comp* array = NULL; char c; do{ system("CLS"); printf("===============================================================================\n"); printf(" MENU \n"); printf("===============================================================================\n"); printf("0. Add date \n"); printf("1. View catalog \n"); printf("Exit - ESC \n"); c = getch(); switch (c){ case '0': array=addDate(array,&n); break; case '1': printDate(array,n); break; default: break; } } while (c != 27); return 0; } struct comp* addDate(struct comp* arry, int *n) { if((*n) == 0) { arry=setMemory(arry,n); } else { arry=reMemory(arry,n); } struct comp poss; system("cls"); printf("===============================================================================\n"); printf(" Add Element \n"); printf("===============================================================================\n"); printf("Firma: "); scanf("%s", &poss.firm); printf("Model: "); scanf("%s", &poss.model); printf("memory(mb): "); scanf("%i", &poss.memory); printf("Prozessor: "); scanf("%s", &poss.proc); printf("card: "); scanf("%s", &poss.card); printf("ScreenX: "); scanf("%i", &poss.screenX); printf("ScreenY: "); scanf("%i", &poss.screenY); printf("Hd: "); scanf("%i", &poss.hd); printf("Price: "); scanf("%lf",&poss.price); arry[(*n)-1] = poss; printf("\nClick to continue...\n"); getch(); return arry; } void printDate(struct comp* arry, int n){ int i; system("CLS"); printf("===============================================================================\n"); printf("| View catalog |\n"); printf("===============================================================================\n"); printf("| Firma | Model | Memory | Prozessor | Card | Screen | Hd | Price |\n"); printf("===============================================================================\n"); for (i = 0; i < n; i++){ printf("|%7s |%7s | %4i |%15s|%10s|%4i*%4i|%4i|%8.0lf|\n", arry[i].firm, arry[i].model, arry[i].memory, arry[i].proc, arry[i].card, arry[i].screenX, arry[i].screenY, arry[i].hd, arry[i].price); } printf("\nClick to continue...\n"); getch(); } struct comp* setMemory(struct comp* arry, int *n){ (*n)++; arry = (struct comp*)malloc((*n)* sizeof(struct comp)); return arry; } struct comp* reMemory(struct comp* arry,int *n){ (*n)++; arry = (struct comp *)realloc(arry, (*n) * sizeof(struct comp)); return arry; }
Объяснение кода листинга программы
- Объяснение кода: Этот код - простая программа, которая позволяет пользователю добавлять и просматривать информацию о компьютерных компонентах. Он состоит из трех основных функций: addDate(), printDate() и menu(). Функция addDate() используется для добавления нового элемента в массив структур comp. Функция printDate() используется для отображения информации о компонентах в массиве. Функция menu() используется для отображения меню программы.
- Ошибка: Ошибка в этом коде возникает при попытке освободить память, выделенную для массива структур comp. В функции reMemory() указатель arry передается в функцию realloc() как аргумент. Однако, в этом коде никогда не вызывается realloc(), поэтому указатель arry никогда не используется. Это может привести к неопределенному поведению, если в другой части программы все-таки вызывается realloc(). Чтобы исправить эту ошибку, необходимо вызывать realloc() в функции reMemory().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д