2014-11-06 118 views
1

我使用hsearch在C中使用哈希表玩耍。最簡單形式的問題是內存中的數據是什麼?我認爲由hcreate創建的哈希表只是指向現有的內存位置,所以數據是通過除了hcreate/hsearch(當然除了由hcreate分配的哈希表本身除外)分配的。hsearch存儲數據在哪裏?

爲了測試這個,我寫了一個簡單的程序來創建一個哈希表。原始數據是一個名爲「回覆」的字符數組。我使用strtok_r將數組分爲不同的鍵/值對,然後使用hsearch創建哈希表。我用hsearch執行「查找」,找到我的鍵值對,然後我打開原始內存並再次查找。我仍然找到它。那麼數據在哪裏存儲?我沒有分配任何特別的東西。以下是一些測試代碼,您可以運行以查看我的意思。你應該可以用gcc編譯並運行它。

#include <stdio.h> 
 
#include <stdlib.h> 
 
#include <stdarg.h> 
 
#include <search.h> 
 
#include <errno.h> 
 
#include <string.h> 
 

 
/** --------------------------------------------------------------------------- 
 
* store 
 
*/ 
 
void store(char *key, char *value) { 
 
    ENTRY e, *ep; 
 
    e.key = key; 
 
    e.data = value; 
 
    ep = hsearch(e, ENTER); 
 
    if (ep == NULL) { 
 
    perror("hsearch"); 
 
    exit(1); 
 
    } 
 
    ep->data = (char *)value; 
 
    } 
 

 
/** --------------------------------------------------------------------------- 
 
* fetch 
 
*/ 
 
int fetch(char *key, char **value) { 
 
    ENTRY e, *ep; 
 
    e.key=key; 
 
    ep = hsearch(e, FIND); 
 
    if (ep) { 
 
    *value = (char *)ep->data; 
 
    return 1; 
 
    } 
 
    else 
 
    return 0; 
 
    } 
 

 
/** --------------------------------------------------------------------------- 
 
* main 
 
*/ 
 
void main(void) { 
 
    int i; 
 
    char *saveptr, *token, *subtoken, *key, *value; 
 

 
    // this is to simulate what a reply string looks like from my hardware... 
 
    char reply[] = "BACKPLANE_TYPE=1 BACKPLANE_REV=3 BACKPLANE_VERSION=1.0.641 BACKPLANE_ID=002428867071B05C POWER_ID=000000AC19B4 MOD_PRESENT=3F2"; 
 

 
    hcreate(64); 
 

 
    if ((token = strtok_r(reply, " ", &saveptr)) != NULL) { 
 
    subtoken = strstr(token, "="); 
 
    subtoken++; 
 
    key = strsep(&token, "="); 
 
    store(key, subtoken); 
 
    } 
 

 
    do { 
 
    if ((token = strtok_r(NULL, " ", &saveptr)) != NULL) { 
 
     if ((subtoken = strstr(token, "=")) == NULL) break; 
 
     subtoken++; 
 
     if ((key=strsep(&token, "=")) == NULL) break; 
 
     } 
 
    else 
 
     break; 
 
    store(key, subtoken); 
 
    } while (1); 
 

 
    // recall one of the key-value pairs 
 
    if (fetch((char*)"BACKPLANE_VERSION", &value)) printf("VER = %s\n", value); 
 

 
    // wipe everything out 
 
    saveptr= subtoken= token= key= value=NULL; 
 
    for (i=0; i<strlen(reply); i++) reply[i]='\0'; 
 

 
    // where is the storage? 
 
    if (fetch((char*)"BACKPLANE_VERSION", &value)) printf("VER = %s\n", value); 
 
    }

回答

0

每個數據點到reply[]陣列的不同位置上。 您可以在第二個fetch之前添加memset(reply, 0, sizeof(reply));並運行。第二個fetch你什麼也得不到。