[Си]Ошибка при использовании Realloc

iluxa1810
Дата: 22.03.2015 20:50:00
Не могу понять, почему в функции addItem, на строчке table=realloc(table,sizeof(struct Item)*(*n));, я получаю ошибку связанную с памятью...
Для того, что бы получить ошибку, нужно нажать 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;
	void (*P[4])(struct Item *,int*)={addItem,deleteItem,searchItem};
	table=malloc(sizeof(struct Item));
	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=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;
	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");
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)
{

}
White Owl
Дата: 22.03.2015 23:36:43
1) Приведи в порядок форматирование. Читать невозможно
2) Посчитай количество элементов в массиве функций, в константном массиве инициализации и сравни с максимальным кодом функции
3) Открой для себя разницу между sometype *variable и sometime **variable. В данном случае, тебе нужно второе... (потому и realloc падает что ты с уровнем ошибся).
4) Вопросы по Си обсуждаются в С++ форуме.

Модератор: Тема перенесена из форума "Программирование".