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