2014-02-14 3 views
0

입력 파일 :포인터 값 변경

JOHN 9999999999 
MEENA 9888888888 
RIA 8718218218 
SONIA 7777777777 
FINCH 1234567890 
  • 내가 그것을에 "NO VALUE"항목으로 sentinal을 만들 list.I로 파일의 내용을 추가하여 원형 연결리스트를 만들려고합니다.

  • uploadAddresses()에서 while 루프가 끝날 때 gdb p-> next-> name에서 코드를 테스트했을 때 Finch.How가 가능합니까? p 값이 동일합니다. 각각 임시 값만 변경됩니다. 되풀이.

    #include<stdio.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #define MAXPHONENO 100 
    
    //Variables declaration 
    struct Contact { 
        char *name; 
        char *mobileno; 
        struct Contact *next; 
    }; 
    typedef struct Contact Contact;  
    typedef Contact* PHBOOK; 
    
    //Function declaration 
    PHBOOK createAddressBook(); 
    PHBOOK uploadAddresses(PHBOOK pb,char *name); 
    
    //Implementation 
    PHBOOK createAddressBook(){  
        PHBOOK pb = (PHBOOK)malloc(sizeof(Contact)); 
        pb->name = "NO ENTRY";  
        pb->mobileno = "NO ENTRY";  
        pb->next = pb;  
        return pb;  
    } 
    
    
    PHBOOK uploadAddresses(PHBOOK p,char *fname){ 
        PHBOOK temp = p; 
        char mob[20],name[20]; 
        FILE *fp = fopen(fname,"r"); 
        while(fscanf(fp,"%s %s",name,mob)!=EOF){ 
        temp->next = (PHBOOK)malloc(sizeof(Contact));  
        temp = temp->next;  
        temp->name = name;  
        temp->mobileno = mob;  
        printf("%s %s\n",name,mob);  
        }  
        temp->next = p;  
        return p;  
    } 
    
    int main(){  
        PHBOOK pb = createAddressBook();  
        pb = uploadAddresses(pb,"/home/user/names_mobile");  
        return 0; 
    } 
    
+0

여기서'createAddressBook' 함수의 코드는 무엇입니까? –

+0

createAddressBook()에 대한 코드를 게시했습니다. – user3310015

+0

순환 링크 된 목록을 원한다면 왜 다음 항목 만 가리키고 이전 항목도 가리키고 있지 않습니까? 또한,리스트의 마지막 요소를 정의하기 위해, 다음 요소에 대한 포인터는 그 자체가 아닌'null'으로 정의되는 데 사용됩니다. – adripanico

답변

1
temp->name = name; 

는 만 temp->name 포인터를 할당.

이 포인터는 로컬 변수를 가리 킵니다.

편집 :

케이스 숯불 이름

[20] 입력 이름을 포함하는 fscanf에서 사용되는 그것의 문맥 각 루프에서 변화했다. while 루프가 끝나면 Finch가됩니다.

"temp-> name"이 "finch"가 포함 된 "char name [20]"을 가리킨다는 것을 알기 때문에 그것을 보았습니다.

+0

로컬 변수에 대한 참조를 저장하는 것이 좋지 않은 이유에 대해 설명을 추가하고자 할 수 있습니다. – alk

+0

@alk sure, thanks –

1

변경 :

temp->name = name; 
temp->mobileno = mob;  

사람 :

char *name; 
char *mobileno; 

에 대한

temp->name = malloc(strlen(name)+1); 
temp->mobileno = malloc(strlen(mob)+1); 
strcpy(temp->name,name); 
strcpy(temp->mobileno,mob); 
+0

맞습니다.'name'과'mobileno'를 char에 대한 포인터로 정의했습니다. 세그먼트 화 오류가 발생하지 않는 것은 이상한 일입니다. – adripanico

0

의 malloc 일부 메모리뿐만 아니라이가 문제를 해결하는 것입니다.

PHBOOK uploadAddresses(PHBOOK p,char *fname){ 

PHBOOK temp = p; 
char mob[20],name[20]; 

FILE *fp = fopen(fname,"r"); 


    while(fscanf(fp,"%s %s",name,mob)!=EOF) 
    { 
    temp->next = (PHBOOK)malloc(sizeof(Contact)); 
    temp = temp->next; 
    temp->name = (char*)malloc(sizeof(char) * MAX_NAME) ;  
    temp->mobileno = (char*)malloc(sizeof(char) * MAX_PHNO) ; 

    strcpy(temp->name,name); 
    strcpy(temp->mobileno,mob); 

    }  
    temp->next = p;  
    return p;  

}

+0

왜 마지막 요소가 위의 코드에서 첫 번째 요소에 연결되어 있습니까? – 51k

0

향상된 코드 :

주 <%의 MS> 동적 문자열 공간을 할당 수정. 또한 파일을 닫아야합니다. 그렇지 않으면 리소스 누출이 발생합니다.

PHBOOK uploadAddresses(PHBOOK p,char *fname){ 
     PHBOOK temp = p; 
     char *mob,*name; 
     FILE *fp = fopen(fname,"r"); 

     if (!fp) 
     return temp; 

     while (fscanf(fp,"%ms %ms",&name,&mob)!=EOF) { 
     temp->next = malloc(sizeof(Contact));  
     temp = temp->next; 
     temp->name = name;  
     temp->mobileno = mob;  
     printf("%s %s\n",name,mob);  
     } 

     fclose(fp); 
     temp->next = p;  
     return p; 
    }