call中的realloc()打印垃圾值

时间:2013-02-14 11:49:51

标签: c realloc

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

}

3 个答案:

答案 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)
{