Ошибка при передаче в функцию указателя на структуру. - 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 значение, указывающее на начало выделенного массива структур. Если память не будет выделена успешно, код может вызвать ошибку. Вот список действий в коде:
- Функция input() принимает аргумент str типа aeroflot **.
- Код выполняет некоторую операцию, и затем передает управление.
- Значение указателя str используется для разыменования указателя.
- Вызывается функция Malloc(), которая выделяет память для n элементов структуры aeroflot.
- Значение указателя str присваивается значению, возвращаемому функцией Malloc().
- Если выделение памяти не удалось, код может вызвать ошибку.
- Код продолжает выполнять операции с новым значением указателя str.
- Если указатель str не разыменовывается перед использованием, это может привести к неопределенному поведению.
- Код может продолжать использовать выделенную память для дополнительных операций.
- Если выделенная память не освобождается, это может привести к утечкам памяти.
- Возвращаемое значение функции input() не указано.
- Если код вызывает ошибку, он может быть неспособен корректно обработать эту ошибку.
- Код может не проверять, был ли указатель str разыменован перед использованием.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
- Код может не проверять, была ли выделенная память успешно освобождена.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
- Код может не проверять, была ли выделенная память успешно освобождена.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
- Код может не проверять, была ли выделенная память успешно освобождена.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д