0

すべてのコードをアップロードしました。これは進行中の作業です。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++;
        }
    }

}
4

3 に答える 3

8

1つの問題は、新しく割り当てられたメモリのアドレスを返すことです。の戻り値を格納します。完全に新しいメモリブロックを割り当て、再割り当てされるメモリの内容と前のメモリをコピーする場合があります。以前のメモリ(現在はd)へのアクセスは未定義の動作であり、再割り当て後のジャンク出力の原因である可能性があります。realloc() realloc()free()free()

の戻り値を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;
于 2013-02-14T11:52:12.380 に答える
1

エラーが見つかりました...(buff_size + 5)* sizeof(contactinfo *)を渡す必要はありませんでしたが、単にrealloc(list、buff_size + 5);...私のために働きました...

于 2013-02-16T22:12:22.430 に答える
0

ContactListは構造体ポインターへのtypedefだと思いますか?

clist1をこの関数に渡すと、メモリ内のブロックへのポインタが含まれます。

reallocは、このポインタを別のポインタに変更する可能性があります(そして、すべてのメモリの内容をこの新しいポインタに移動します)。

この新しい値は、clist1をポインターとして渡したときにこの関数を終了すると失われます。

これが正しく機能することを確認するには、ポインターをポインターに渡し、関数中にそれを参照解除する必要があります。これにより、ポインタが変更された場合に、呼び出し元の関数がそれを認識できるようになります。

void addContact(ContactList* clist1, ContactList clist2, ContactInfo ci, int size)
{   
于 2013-02-14T13:10:27.327 に答える