Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Stans
78 / 54 / 3
Регистрация: 05.12.2009
Сообщений: 435
1

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

25.02.2012, 21:45. Просмотров 1276. Ответов 2
Метки нет (Все метки)

Всем привет! Пишу программку по структурам. При передаче указателя на структуру в функцию выбивает ошибку "Run-Time Check Failure #3 - The variable "str" is being used without being initialized"
Ошибка скорее всего в чем-то простом, но я никак не могу понять где, так как только недавно начал работать со структурами. Помогите найти ошибку.
Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2012, 21:45
Ответы с готовыми решениями:

Ошибка при передаче указателя функции
Привет! В моем понимании приведенный ниже код должен дважды выводить одно и то же. Объясните мне,...

Ошибка при передаче аргументов в функцию
Есть функция определения минимального значения: float minimum(float x,float y) { x = (x&lt;y)? x...

Выяснить экспериментально, что происходит при передаче в функцию printf строки
Упражнение 1.2. Попытайтесь выяснить экспериментально, что происходит при передаче в функцию printf...

Ошибка Access violation при передаче указателя в функцию
выделяю память для нужд програмных и соханяю его. char *resadres =(char*) VirtualAlloc (0,...

Ошибка при передаче в функцию указателя на элемент массива
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; ...

2
rangerx
1950 / 1559 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
26.02.2012, 01:41 2
Цитата Сообщение от Stans Посмотреть сообщение
C
1
if(!input(str))
Цитата Сообщение от Stans Посмотреть сообщение
C
1
2
3
4
5
6
int input(aeroflot *str)
{
 //...
 str=(aeroflot*)malloc(n * sizeof(aeroflot));
 //...
}
Дело в том, что вы передаёте в функцию копию переменной str, в следствии чего str из main так и остаётся неинициализированной. Чтобы изменить переменную внутри функции необходимо передать функции адрес этой переменной.
C
1
2
 // для хранения адреса указателя используется "указатель на указатель"
int input(aeroflot **str)
соответственно вызов
C
1
if(!input(&str))
C
1
2
3
4
5
6
7
int input(aeroflot **str)
{
  //...
  // перед использованием разыменовываем указатель
 *str = (aeroflot*)malloc(n*sizeof(aeroflot));
 // и т.д...
}
1
Stans
78 / 54 / 3
Регистрация: 05.12.2009
Сообщений: 435
26.02.2012, 14:48  [ТС] 3
rangerx, спасибо. Учту свою ошибку, чтобы не повторять ее)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 14:48

Порча указателя при передаче в функцию
Добрый вечер. Проблема такая - при передаче в функцию структуры, полем которой является...

Ошибки преобразования при передаче указателя на функцию
Есть функция SQLITE_API int SQLITE_STDCALL sqlite3_exec( sqlite3*, ...

При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему?
Hi All! class SomeObj { public: int x; }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru