gpt4 book ai didi

c - c.. 中的 realloc() 打印垃圾值

转载 作者:太空宇宙 更新时间:2023-11-04 05:13:56 25 4
gpt4 key购买 nike

我已经上传了所有的代码..这是正在进行的工作..请检查 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 <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++;
}
}

}

最佳答案

一个问题是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;

关于c - c.. 中的 realloc() 打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14874186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com