我上传了所有的代码..这是正在进行的工作..请检查realloc()因为如果我没有达到realloc()的条件一切正常...谢谢evry1 ..
// contactinfo.h-- header file
#ifndef _ELEMENT_H
#define _ELEMENT_H
typedef struct ContactInfo ContactInfo;
struct ContactInfo{
char Name[30];
char email_id[50];
int phon_num;
};
typedef ContactInfo **ContactList;
#endif
//contactops.h
#include "contactInfo.h"
ContactList createCL(int size);
void addContact(ContactList clist1, ContactList clist2, ContactInfo ci, int size);
ContactInfo *findByName(ContactList cl, char *name);
ContactInfo *findByNumber(ContactList cl, int num);
void deleteContactByName(ContactList cl, ContactList c2, char *name);
void deleteContactByNumber(ContactList cl, ContactList c2, int num);
void printContacts(ContactList cl);
void Merge_Sort(int hi, int mid, int lo, ContactList c);
void Merge(int hi , int lo, ContactList c);
// contactopsarr.c #include
#include <string.h>
#include <stdlib.h>
#include "contactInfo.h"
#include "contactOps.h"
int counter =0;
int buff_size = 5; //pre defined Size
ContactList arr_name; //to hold the pointers to the locations of
the shared data by name
ContactList arr_num; //to hold the pointers to the locations of the shared data by number
ContactInfo *list ; // to hold the shared date
int main (){
char search_name[20]; //buffer to hold the name to be searched
int search_numb; //buffer to hold the number to be searched
arr_num = createCL(buff_size);
arr_name = createCL(buff_size);
/************************* Allocation Of the Shared Data *******************************/
list = malloc(buff_size * sizeof(ContactInfo));
if(list == NULL){
printf("Memmory Allocation Of the shared Data failed..\n");
}
/************************ Allocation Completed *****************************************/
char choice; //to hold "y" or "n"
printf("Do you want to Continue...");
scanf(" %c",&choice);
int option; //to hold Choice number to be selected
ContactInfo ci; //buffer to hold the information to be added
while(choice == 'Y'|| choice=='y')
{
printf("\n1.Add Contact\n2.FIND Contact by NAME\n3.FIND Contact by NUMBER\n4.DELETE contact by NAME\n5.DELETE contact by NUMBER\n6.PRINT contact\n");
printf("Enter Your Option..\n");
scanf(" %d",&option);
switch(option)
{
case 1: printf("Enter the Name:\n");
scanf(" %s",&ci.Name);
printf("Enter the Number:\n");
scanf(" %d",&ci.phon_num);
printf("Enter the Email-id:\n");
scanf(" %s",&ci.email_id);
addContact(arr_num , arr_name, ci, buff_size);
break;
/* case 2: printf("Enter the name to be Searched..\n");
scanf(" %s",&search_name);
findByName(list, search_name);
break;
case 3: printf("Enter the number to be Searched..\n");
scanf(" %s",&search_numb);
findByNumber(list,search_numb );
break;
case 4: break;
case 5: break;
*/
case 6: printContacts(arr_num);
break;
default : printf("Enter a Correct Choice...\n");
}
}
}
ContactList createCL(int size){
ContactList temp = malloc(buff_size * sizeof(ContactInfo *));
return temp;
}
void addContact(ContactList clist1, ContactList clist2, ContactInfo ci, int size)
{
printf("Val of counter : %d\n",counter);
printf("Val of buff_size : %d\n", size);
if((counter+1)>=size)
{
/*realloc(list, (buff_size +5)*sizeof(ContactInfo ));
//ContactInfo *temp = malloc((size+5)*sizeof(ContactInfo));
if(list == NULL){
printf("Extended Memory Allocation(0) Failed..Quiting..");
exit(1);
}
/*memcpy(temp, list, counter-1);
list = temp;
free(temp);*/
ContactInfo *tmp_list = realloc(list, (buff_size + 5) * sizeof(ContactInfo));
if (tmp_list == NULL)
{
free(list);
printf("Extended Memory Allocation(0) Failed..Quiting..");
exit(1);
}
list = tmp_list;
/*realloc(clist1, (size +5)*sizeof(ContactInfo*));
//ContactList temp1 = malloc((size+5)*sizeof(ContactList));
if(clist1 == NULL){
printf("Extended Memory Allocation(1) Failed..Quiting..");
exit(1);
}
/*memcpy(temp1, clist1, counter-1);
clist1 = temp1;*/
ContactList tmp_list1 = realloc(clist1, (buff_size + 5) * sizeof(ContactInfo *));
if (tmp_list1 == NULL)
{
free(clist1);
printf("Extended Memory Allocation(1) Failed..Quiting..");
exit(1);
}
clist1 = tmp_list1;
/*realloc(clist1, (size +5)*sizeof(ContactInfo*));
//ContactList temp2 = malloc((size+5)*sizeof(ContactList));
if(clist2 == NULL){
printf("Extended Memory Allocation(2) Failed..Quiting..");
exit(1);
}
/*memcpy(temp2, clist2, counter-1);
clist2 = temp2;
*/
ContactList tmp_list2 = realloc(clist2, (buff_size + 5) * sizeof(ContactInfo *));
if (tmp_list2 == NULL)
{
free(clist2);
printf("Extended Memory Allocation(2) Failed..Quiting..");
exit(1);
}
clist2 = tmp_list2;
buff_size = buff_size + 5;
}
list[counter] = ci;
clist1[counter] = &list[counter]; //holding the location of the list[counter]..
clist2[counter] = &list[counter];
counter = counter + 1; //updating the counter
}
ContactInfo *findByName(ContactList cl, char *name)
{
}
ContactInfo *findByNumber(ContactList cl, int num)
{
}
/*
void deleteContactByName(ContactList cl, ContactList c2, char *name);
void deleteContactByNumber(ContactList cl, ContactList c2, int num);*/
void printContacts(ContactList cl)
{
int i ;
for(i=0 ; i<20; i++)
{
printf(" %s\n", cl[i]->Name);
}
}
void Merge(int hi , int lo, ContactList c)
{
if(hi>lo)
{
int mid = (hi + lo)/2;
Merge(mid, lo, c);
Merge(mid+1, hi, c);
Merge_Sort(hi, mid, lo, c);
}
}
void Merge_Sort(int hi, int mid, int lo, ContactList c)
{
ContactList arr1 = malloc(((counter/2)+1)*sizeof(ContactInfo *));
if(arr1 == NULL)
{
printf("Memory Allocation(3) failed");
}
ContactList arr2 = malloc(((counter/2)+1)*sizeof(ContactInfo *));
if(arr2 == NULL)
{
printf("Memory Allocation(4) failed");
}
int i, j;
int limit_first = mid - lo + 1 ;
int limit_second = hi - mid;
for(i=0; i<limit_first; i++)
{
arr1[i] = c[i];
}
for(j=0; j<limit_second; i++)
{
arr2[j] = c[mid + j + 1];
}
/*ContactInfo temp;
strcpy(temp.Name , "zzzzzzz");
temp.phon_num = 99999999999;
strcpy(temp.email_id, "zzzzzzz");
arr1[i] = &temp;
arr1[j] = &temp;*/
int k;
i=0;
j=0;
for(k=0; k<hi; k++)
{
if(arr1[i] >= arr2[j])
{
c[k] = arr2[j];
j++;
}
else
{
c[k] = arr1[i];
i++;
}
}
}
答案 0 :(得分:8)
一个问题是realloc()
返回新分配的内存的地址:存储realloc()
的返回值。它可以分配一个全新的内存块,并将重新分配的内存的内容复制到前一个内存中free()
。访问先前的内存,现在是free()
d,是未定义的行为,并且是重新分配后垃圾输出的可能原因。
将realloc()
的返回值保存到临时指针并仅在非list
指针为的情况下更新realloc()
(以及与NULL
结合使用的其他指针)返回:
ContactInfo* tmp_list = realloc(list, (buff_size + 5) * sizeof(ContactInfo));
if (tmp_list == NULL)
{
free(list);
fprintf(stderr, "Extended Memory Allocation(0) Failed..Quiting..");
exit(1);
}
list = tmp_list;
答案 1 :(得分:1)
我发现了错误...我不需要传递(buff_size + 5)* sizeof(contactinfo *),但只是realloc(list,buff_size + 5); ...为我工作......
答案 2 :(得分:0)
我假设ContactList是结构指针的typedef?
当你将clist1传递给这个函数时,它包含一个指向内存块的指针。
realloc 可能将此指针更改为其他内容(并将所有内存内容移动到此新指针)。
当您将clist1作为指针传递时退出此函数时,此新值将丢失。
为了确保它正常工作,您需要将指针传递给指针并在函数期间对其进行解除。这可以确保指针是否发生变化,调用函数会知道它。
void addContact(ContactList* clist1, ContactList clist2, ContactInfo ci, int size)
{