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