Ошибка при передаче в функцию указателя на структуру. - 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 разыменован перед использованием.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
- Код может не проверять, была ли выделенная память успешно освобождена.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
- Код может не проверять, была ли выделенная память успешно освобождена.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.
- Код может не проверять, была ли выделенная память успешно освобождена.
- Если код вызывает ошибку, он может не предоставить ясного сообщения об ошибке.