#include <stdio.h>   
#include <string.h>
#include <stdlib.h>
     
/* 구조체 선언 */
     
typedef struct
{     
    char name[20];     // 이름을 저장할 맴버
    char number[30];   // 전화번호를 저장할 맴버

}PhoneNumber;


           
/*사용할 함수들을 미리 선언*/
     

void MenuProcessor(PhoneNumber * Person[],int * i);  
void Registration(PhoneNumber * Person[],int * i);  
void Search(PhoneNumber * Person[],int * i);  
void Deletion(PhoneNumber * Person[],int * i);  
void ShowAll(PhoneNumber * Person[],int * i);  
void Modification(PhoneNumber * Person[],int * i);  
void ShowMenu(PhoneNumber * Person[],int * i);
     
     
/* 프로그램 실행시 최초 메인함수 호출 */
     
 int main()   
{           
    PhoneNumber * Person[1000];       // 최대 1000명을 저장할 구조체변수 선언
 
 
 int i=0;                     // 구조체변수의 배열요소를 이동시킬 변수 선언
    int * ptr=&i;               // 다른함수에서도 접근시킬수 있도록 i를 가리키는 포인터변수 선언
      
    ShowMenu(Person,ptr);     //메뉴를 보여주는 함수 호출
 
 
          
    return 0;   
}  
     
/* 메뉴를 보여주는 함수 */
     
void ShowMenu(PhoneNumber * Person[],int * i)
{
 printf("*****Menu*****n");  
    printf("<1.Registration><2.ShowAll><3.Search>n");  
    printf("<4.Deletion><5.Modification><6.Exit>n");  
    printf("Enter_the_menu_number:");
 MenuProcessor(Person,i);
}
     
/* 메뉴를 처리하는 함수 */
             
void MenuProcessor(PhoneNumber * Person[],int * i)   // ShowMenu에서 전달받은 num값을 a에 대입
{   
 int a;
 scanf("%d", &a);
    if(a==1)                    // 1일 경우 등록처리 함수 호출
        Registration(Person,i);      
    if(a==2)                // 2일 경우 전체를 보여주는 함수 호출  
        ShowAll(Person,i);           
    if(a==3)                    // 3일 경우 검색 함수 호출
        Search(Person,i);  
    if(a==4)                    // 4일 경우 삭제 함수 호출
        Deletion(Person,i);  
    if(a==5)                    // 5일 경우 수정 함수 호출
        Modification(Person,i);  
    if(a==6)                    // 6일 경우 탈출하면서 메인함수로 복귀
        return ;             
}   
           
/* 자료를 등록하는 함수 */
     
void Registration(PhoneNumber * Person[],int * i)   
{   
    Person[*i]=(PhoneNumber*)malloc(sizeof(PhoneNumber));
 

    printf("Name:");             
    scanf("%s", Person[*i]->name);  // 입력받은 이름을 i번째 자리 name맴버에 등록 (i가 가리키는 변수는 결국 메인함수의i이기 때문)
       
   
    printf("Phone_number:");  
    scanf("%s", Person[*i]->number);  // 입력받은 번호를 i번째 자리 number맴버에 등록
                  
    (*i)++;                 // 다음 자리에 등록될수 있도록 i의 값을 1씩 증가시킴          
    ShowMenu(Person,i);     //   메뉴보기 함수 호출   
}   
          
          
/* 자료를 검색하는 함수 */
     
void Search (PhoneNumber * Person[],int * i)  
{  
    int j;  
    char Sch[20];   // 검색할 이름을 나타내는 name맴버와 형식이 같은 변수선언
          
    printf("Name:");  
    scanf("%s", &Sch);  // 검색할 이름을 입력
          
    for(j=0; j<*i; j++)   
        if(!strcmp(Person[j]->name,Sch)) // Sch와 j번째 자리에 있는 사람이름과 동일하면 j번째 사람의 정보를 출력 
            printf("Name:%s--->Phone_number:%s--->address:%lldn",Person[j]->name,Person[j]->number,&Person[j]);  
    ShowMenu(Person,i); // 메뉴보기 함수 호출
}  
     
/* 자료를 제거하는 함수 */
          
void Deletion (PhoneNumber * Person[],int * i)  
{  
    char Dlt[20];          // 제거할 이름을 나타내는 name맴버와 형식이 같은 변수선언
    int j;

          
    printf("Name:");  
    scanf("%s", &Dlt);        // 제거할 이름을 입력
          
    for(j=0; j<*i; j++)  
    {  
        if(!strcmp(Person[j]->name,Dlt))  // Delet와 j번째 자리에 있는 사람이름과 동일하면
        {  
   free(Person[j]);
      // j번째 사람의 정보에 해당되는 메모리영역을 해제
            while(j<(*i)-1)          // j번째 사람의정보에 j+1번째 사람의 정보를 덮어씌움, i-1번째까지 반복
            {  
    
    
                Person[j]=Person[j+1]; //  
    
    j++;  
            }
   
            (*i)--;  // 한명이 지워졌으므로 자리를 한칸 앞당김
        }
          
    }  
    ShowMenu(Person,i);// 메뉴보기 함수 호출
          
}     
          
/* 자료를 수정하는 함수 */
          
void Modification(PhoneNumber * Person[],int * i)  
{  
    char Modification[20];  // 수정할 사람이름을 나타내는 name맴버와 형식이 같은 변수선언
    char NewNumber[30];  //수정할 번호를 나타내는 number맴버와 형식이 같은 변수선언
          
    int j;  
          
    printf("Name:");  
    scanf("%s", &Modification);  // 수정할 이름을 입력
          
    for(j=0; j<*i; j++)  
    {  
        if(!strcmp(Person[j]->name,Modification))  // Modification과 j번째 자리에 있는 사람이름과 동일하면
        {  
            printf("New_Phone_number:");  
            scanf("%s", &NewNumber);            // 새로운 번호를 입력
            strcpy(Person[j]->number,NewNumber);   // 새로운 번호를 j번째 번호에 덮어씌움
        }  
    }  
        // 메뉴보기 함수 호출
    ShowMenu(Person,i);       
}  
          
          
/* 전체보기 함수 */
          
void ShowAll(PhoneNumber * Person[],int * i)   
{   
    int j;   
    for(j=0; j<*i; j++)        // 지금까지 등록된 정보를 출력
        printf("Name:%s--->Phone_number:%s--->address:%lldn",Person[j]->name,Person[j]->number,&Person[j]);   
    ShowMenu(Person,i);         //메뉴보기 함수 호출
}



[출력결과]



*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:1
Name:AAA
Phone_number:123
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:1
Name:BBB
Phone_number:123
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:1
Name:CCC
Phone_number:123
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6721623819807484
Name:BBB--->Phone_number:123--->address:6721623819807488
Name:CCC--->Phone_number:123--->address:6721623819807492
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6718686062177020
Name:BBB--->Phone_number:123--->address:6718686062177024
Name:CCC--->Phone_number:123--->address:6718686062177028
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6715748304546556
Name:BBB--->Phone_number:123--->address:6715748304546560
Name:CCC--->Phone_number:123--->address:6715748304546564
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6712810546916092
Name:BBB--->Phone_number:123--->address:6712810546916096
Name:CCC--->Phone_number:123--->address:6712810546916100
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:



문제는 ShowAll 함수를 호출할때마다 adress값 (구조체변수 Person[해당값]의 주소값) 이 계속바뀝니다

뭐가문제인지 잘 모르겠네요 몇시간동안 붙잡아도 답이 안나옵니다 ㅠㅠ

고수분들 조금만 도와주세요 ...