2014-11-23 127 views
0

我有一個結構:bsearch與結構的指針數組

typedef struct entry_t { 
    char * name; 
    int lines [MAX]; 
    int n;/*n lines*/ 
} entry_t; 

和結構entry_t * list[MAX];

我嘗試使用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 argc main 
DB argv main 
DB printf argc 
DB printf argv 
DB printf argc 
DB printf argv 
DB printf printf 
0M: 

奇怪的是,那sentry不是null,但name是奇怪的東西(隨機存儲位置)。

THX(用於接收的bsearch()結果時)

回答

0

sentry必須struct entry_t **類型。

+0

如果你刪除struct(typedef struct),你的回答是正確的,thx很多 – user547995 2014-11-23 23:48:00

+0

寫'struct entry_t'和簡單的'entry_t'應該在你的代碼中是相等的。但是,寫'struct'和避免'typedef'通常是一種更好的風格 – ensc 2014-11-23 23:50:47