Ошибка передачи указателя на выделенную память - 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().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д