Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
iluxa1810
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
1

Ошибка при при использовании realloc

22.03.2015, 19:35. Просмотров 590. Ответов 6
Метки нет (Все метки)

В методе AddItem вылетает ошибка доступа к памяти...
С чем это может быть связано?
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#pragma hdrstop
#pragma argsused
 
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif
 
#define SIZE 10
struct Item{
     int key;
     int release;
     char *info;
    };
 
void addItem(struct Item *,int*);
void deleteItem(struct Item *,int*);
void searchItem(struct Item *,int);
int enterData(int*,int*,char*,struct Item*,int);
int CheckKey(int ,struct Item *,int);
int CheckRelease(int ,int ,struct Item *,int);
int _tmain(int argc, _TCHAR* argv[])
{   
    struct Item *table;
    int ctrl,n=0;
    void (*P[4])(struct Item *,int*)={addItem,deleteItem,searchItem};
    puts("0 add\n1 delete \n2 search \n");
    for (;;) 
    {
        scanf("%d",&ctrl);
        if (ctrl>5) 
        {
            break;  
        }
        (*P[ctrl])(&table,&n);
    }
    return 0;
}
void addItem(struct Item *table,int *n)
{
int key,release=1;
char *info;
 if (n==SIZE) 
 {
    puts("Table is full. can not continue \n");
    return;  
 }
 if(enterData(&key,&release,info,table,*n))
 {
    (*n)++;
    table=(struct Item*)realloc(table,sizeof(struct Item)*(*n));
    table[n-1].key;
    table[n-1].release;
    table[n-1].info;
 }
 else return;
}
int enterData(int *key,int *release, char *info,struct Item *table,int n)
{
int a;
puts("Enter key: ");
scanf("%d",key);
if (CheckKey(*key,table,n)==2) {
    puts("This item already exists. The number of releases exhausted");
    return 0;
}
if (CheckKey(*key,table,n)==1) {
    puts("This item already exists. You can add 1 realese");
}
puts("\n Enter release: ");
do
    {
    scanf("%d",release);
    }
while (CheckRelease(*key,*release ,table,n)==0);
puts("\n Enter info(50 chars): \n");
info=malloc(sizeof(char)*50);
fflush(stdin);
gets(info);
return 1;
}
 
int CheckKey(int key,struct Item *table,int n)
{
 
int i,cnt=0;
if (n==0) {
    return 0;   
}
for (i = 0; i <= n-1; i++) {
    if(table[i].key==key)
        {
            cnt++;
        }
}
return cnt;
}
int CheckRelease(int key,int release ,struct Item *table,int n)
{
int i;
if (n==0) {
    return 1;   
}
for (i = 0; i <= n-1; i++)
    {
    if(table[i].key==key)
        {
            if (table[i].release==release) 
            {
              puts("Thies element have this release. Enter another release.");
              return 0; 
            }
            return 1;
        }
    }
}
 
void deleteItem(struct Item *table,int *key)
{
 
}
 
 
void searchItem(struct Item *table,int key)
{
 
}
Добавлено через 2 минуты
Для получения ошибки, нужно нажать 0 и ввести какие-нибудь данные.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2015, 19:35
Ответы с готовыми решениями:

Ошибка при перераспределении памяти realloc
Здравствуйте, дорогие друзья. Помогите, пожалуйста разобраться с перераспределением памяти для...

Ошибка при использовании указателей
Задание Составить программу, которая заполняет массив случайными целыми числами из диапазона,...

Ошибка при использовании структур
Мне задали очень странное дополнительное задание. Организовать многочлены, с которыми я оперирую в...

Ошибка при использовании Clrscr
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include&lt;iostream&gt; double SumD(int a) { double s=a;...

Ошибка при использовании delete
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; void main() { char *ar=new...

6
Байт
Эксперт C
22265 / 14021 / 2962
Регистрация: 24.12.2010
Сообщений: 29,905
22.03.2015, 20:27 2
iluxa1810, Похоже, что table у тебя не инициализирован.
realloc(p,...) использует значение p (кажется, оно может быть даже NULL), а если p указывает неизвестно куда, то и получается неизвестно что.
1
iluxa1810
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
22.03.2015, 20:34  [ТС] 3
Байт,
Я пробовал в Main
C
1
table=malloc(sizeof(struct Item)*1);
, а так же NULL, но конкретно в методе вылетает ошибка...
Вот в Main realloc работает после инициализации переменной, а вот в методе почему-то вызывает ошибку...
Хотя, вроде, все верное делаю.
0
Байт
Эксперт C
22265 / 14021 / 2962
Регистрация: 24.12.2010
Сообщений: 29,905
22.03.2015, 20:49 4
iluxa1810, Все странно несколько... Программа вообще не должна транслироваться... Или хотя бы варринги давать. Смотри
C
1
2
void addItem(struct Item *,int*);
void addItem(struct Item *table,int *n) { ...
Тут нужен адрес структуры.
А в Майне
C
1
2
3
4
struct Item *table;
...
(*P[ctrl])(&table,&n);  // один из твоих P = addItem, иначе
addItem(&table,&n);  // Передается Адрес Адреса
1
iluxa1810
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
22.03.2015, 21:14  [ТС] 5
Байт,
Да, действительно упустил.
Спасибо

Добавлено через 8 минут
Байт,
Не знаю стоит ли создавать еще одну тему для небольшого вопроса, но попробую спросить тебя тут:
Почему-то info, которое возвращается из enterData не меняет значение переменной в AddItem.
С чем это может быть связано?

Добавлено через 5 минут
Теперь он у меня при попытке присвоения значений валится=(
C
1
2
3
4
5
6
7
8
 if(enterData(&key,&release,info,table,*n))
 {
    (*n)++;
    table=realloc(table,sizeof(struct Item)*(*n));
    table[n-1].key=key;
    table[n-1].release=release;
    table[n-1].info=info;
 }
Добавлено через 6 минут
Звездочку потерял.
0
Байт
Эксперт C
22265 / 14021 / 2962
Регистрация: 24.12.2010
Сообщений: 29,905
22.03.2015, 21:29 6
iluxa1810, Код твой довольно объемен, и копаться в нем, по-честному, особого желания нет. Думаю, что ошибка того же плана. Проверь, что ждешь и что передаешь. Может быть будет не лишним повторить материал про передачу параметров, обратить внимание, что в Си они передаются по значению. И включи предупреждения (варринги), они обязаны показать на такого рода ошибки. Как это делается в твоем трансляторе - я не знаю. Но какие-то галочки или флаги точно есть.
1
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10683 / 6380 / 1591
Регистрация: 25.07.2009
Сообщений: 12,125
23.03.2015, 20:23 7
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Не знаю стоит ли создавать еще одну тему для небольшого вопроса
 Комментарий модератора 
Пункт правил форума 5.16 запрещает задавать в одной теме разные задания. Если задание одно, но в ходе его решения возникают дополнительные вопросы, создавать для каждого из них по новой теме абсолютно не за чем. Вы всё правильно сделали.
0
23.03.2015, 20:23
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2015, 20:23

Ошибка при использовании strlen
scanf(&quot;%s&quot;,&amp;s); d=strlen(s); чего ошибка?

Ошибка при использовании аргумента по умолчанию
Не пойму, почему ошибка? #include &lt;stdio.h&gt; int arav(int amount=5) { return ++amount; }...

Ошибка при использовании пользовательской библиотеки
Уважаемые программисты, помогите найти причину ошибки! float a,b,c; int i,n,j; ...


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

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

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