2014-11-23 4 views
0

나는 구조체가bsearch는

int addToList(entry_t * list[], int n, const char * name, int lineNr){ 
    int i = 0; 
    int j = 0; 
    entry_t * entry; 
    entry_t * sentry; 
    bool found = false; 
    char * tmp = (char*) malloc(sizeof(char)*MAX); 

    sentry = (entry_t *) bsearch(name,list,n,sizeof(entry_t *), cmpEntries2); 
    if(sentry != NULL){ 
     printf("%s",sentry->name); 
     i = sentry->n; 
     sentry->lines[i] = lineNr; 
     sentry->n++; 
    } 
    else { 
    sentry = (entry_t *) malloc(sizeof(entry_t)); 
    strcpy(tmp,name); 
    sentry->name = tmp; 
    sentry->lines[0] = lineNr; 
    sentry->n = 1; 
    list[n] = sentry; 
    n++; 
    } 

    return n; 
} 

int cmpEntries2(const void * a, const void * b){ 
    assert (a != NULL); 
    assert (b != NULL); 
    printf("DB %s %s\n",(const char*)a,(*(entry_t **)b)->name); 
    return strcmp((const char*)a, (*(entry_t **)b)->name); 
} 

내 DB 로그

DB argc main 
DB argv main 
DB printf argc 
DB printf argv 
DB printf argc 
DB printf argv 
DB printf printf 
0M: 

이상한 점은 sentry은 null이 아니지만 name은 이상한 것입니다 (임의의 메모리 위치).

(bsearch()의 결과를 수신하기 위해 사용되는)

답변

0

sentry 들으 struct entry_t ** 형이어야한다.

+0

구조체 (typedef 구조체)를 제거하면 대답이 정확합니다. – user547995

+0

'struct entry_t'를 작성하고 간단한'entry_t'가 코드에서 동일해야합니다. 그러나 일반적으로'struct'를 작성하고'typedef'를 피하는 것이 더 좋은 스타일입니다 – ensc