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

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

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

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


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

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

6   голосов , оценка 3.667 из 5
Похожие ответы