Ошибка при передаче в функцию указателя на структуру. - C (СИ)

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

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

Всем привет! Пишу программку по структурам. При передаче указателя на структуру в функцию выбивает ошибку "Run-Time Check Failure #3 - The variable "str" is being used without being initialized" Ошибка скорее всего в чем-то простом, но я никак не могу понять где, так как только недавно начал работать со структурами. Помогите найти ошибку. Вот код:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>
 
struct aeroflot
{ char *reis;
  int number;
  char *type;
};
 
int input(aeroflot*);
 
int _tmain(int argc, _TCHAR* argv[])
{   setlocale(LC_ALL,"Russian");
    
    aeroflot* str;
    int k, l;
    
    while(1)
        {printf("Выберите желаемое действие\n");
         printf("1. Заполнение структур\n");
         printf("2. Отсортировать структуры\n");
         printf("3. Поиск рейса по месту прибытия\n");
         printf("4. Вывод всех рейсов\n");
         printf("5. Выход\n");
         scanf("%d",&k);
 
         switch(k)
            {case 1: if(!input(str)) printf("Произошла ошибка!!!"); break;
             case 2: break;
             case 3: break;
             case 4: break;
             case 5: return 0;
            }
 
         printf("Вывести меню еще раз?(1. Да/0. Нет)");
         scanf("%d",&k);
         if(!k) break;
        }
 
    return 0;
}
 
int input(aeroflot *str)
{ int i, n; char *s;
 
    printf("Введите количество рейсов\n");
    scanf("%d",&n);
    str=(aeroflot*)malloc(n*sizeof(aeroflot));
 
    s=(char*)malloc(50);
    for(i=0;i<n;i++)
    {printf("Рейс%d:\n\n",i+1);
     
     printf("Введите пункт назначения рейса\n");
     fflush(stdin);
     gets(s);
     if(!((str+i)->reis=(char*)malloc(strlen(s)))) {printf("Запись невозможна!!!"); return 0;}
     strcpy((str+i)->reis,s);
 
     printf("Введите номер рейса\n");
     while(!scanf("%d",&(str+i)->number)) fflush(stdin);
     
     printf("Введите тип рейса(charter/regular)\n");
     fflush(stdin);
     gets(s);
     if(!((str+i)->type=(char*)malloc(strlen(s)))) {printf("Запись невозможна!!!"); return 0;}
     strcpy((str+i)->type,s);
    }
 
  return 1;
}

Решение задачи: «Ошибка при передаче в функцию указателя на структуру.»

textual
Листинг программы
int input(aeroflot **str)
{
  //...
  // перед использованием разыменовываем указатель
 *str = (aeroflot*)malloc(n*sizeof(aeroflot));
 // и т.д...
}

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

В этом коде функция input() принимает указатель на структуру aeroflot. Функция Malloc() используется для выделения памяти для структуры aeroflot. Значение переменной n используется для определения количества элементов, которые нужно создать в массиве структур. Код пытается присвоить указателю str значение, указывающее на начало выделенного массива структур. Если память не будет выделена успешно, код может вызвать ошибку. Вот список действий в коде:

  1. Функция input() принимает аргумент str типа aeroflot **.
  2. Код выполняет некоторую операцию, и затем передает управление.
  3. Значение указателя str используется для разыменования указателя.
  4. Вызывается функция Malloc(), которая выделяет память для n элементов структуры aeroflot.
  5. Значение указателя str присваивается значению, возвращаемому функцией Malloc().
  6. Если выделение памяти не удалось, код может вызвать ошибку.
  7. Код продолжает выполнять операции с новым значением указателя str.
  8. Если указатель str не разыменовывается перед использованием, это может привести к неопределенному поведению.
  9. Код может продолжать использовать выделенную память для дополнительных операций.
  10. Если выделенная память не освобождается, это может привести к утечкам памяти.
  11. Возвращаемое значение функции input() не указано.
  12. Если код вызывает ошибку, он может быть неспособен корректно обработать эту ошибку.
  13. Код может не проверять, был ли указатель str разыменован перед использованием.
  14. Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
  15. Код может не проверять, была ли выделенная память успешно освобождена.
  16. Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
  17. Код может не проверять, была ли выделенная память успешно освобождена.
  18. Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
  19. Код может не проверять, была ли выделенная память успешно освобождена.
  20. Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.

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


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

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

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