Как правильно написать realloc для массива структур?
Проблема заключается в следующем:
Когда я первый раз попадаю в функцию addItem и делаю в ней realloc указателя на структуру, а потом еще присваиваю значения, то после выхода из функции я вижу эти значения. Когда я второй раз попадаю в функцию, проделываю эти же действия, то после этого у меня отображаются значения после первого раза, а от второго раза остаются только 0. По задумке, после каждой итерации у меня должен пополняться элементами массив за счет realloс, но почему-то не работает.
realloc происходит в методе EnterData.
P.S. Не пугайтесь. Полный листинг я выложил лишь для того, мало ли кто-нибудь захочет скомпилировать прогу...
Если кто-нибудь захочет скомпилировать программу и посмотреть на результаты, то нужно вбить 0, а потом какие-то данные.
#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,i;
void (*P[4])(struct Item *,int*)={addItem,deleteItem,searchItem};
table=malloc(sizeof(struct Item));
for (;;)
{
puts("0 add\n1 delete \n2 search \n");
scanf("%d",&ctrl);
if (ctrl>5)
{
break;
}
(*P[ctrl])(table,&n);
for (i=0; i<=n-1; i++) {
printf("%d\n",table[i].key);
}
}
return 0;
}
void addItem(struct Item *table,int *n)
{
int key,release;
char *info=malloc(sizeof(char)*50);
if (*n==SIZE)
{
puts("Table is full. can not continue \n");
return;
}
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;
}
}
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");
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)
{
}