【问题标题】:UTHash in function call does iteration once but not second time函数调用中的 UTHash 迭代一次但不是第二次
【发布时间】:2013-09-25 04:29:31
【问题描述】:

我在对局部变量使用 uthash 时遇到了一些问题。

我的代码看起来像这样,query_dict 是一个局部变量 uthash:

main functions:
    query* query_dict = NULL;

    split_query_into_terms(querystr, &query_dict);
    print_query_struct(&query_dict);

    prefetch_tokens(&query_dict);

更仔细:

void prefetch_tokens(query** query_dict) {
    query* entry;

    for(entry=*query_dict; entry != NULL; entry=entry->hh.next) {
        handle_token(entry->term);
    }
}

void add_term_to_query(query** query_dict, char* term, dictionary_entry* dict_entry) {
    // if query in hashtable, increase score:
    query* myq = NULL;

    if(*query_dict != NULL) 
        HASH_FIND_STR(*query_dict, term, myq);

    if(myq == NULL) {
        myq = init_alloc_query(term);
        myq->dict_entry = dict_entry;
        HASH_ADD_KEYPTR(hh, *query_dict, myq->term, strlen(myq->term), myq);
    } else {
        myq->score += 1.0f;
    }
}

void split_query_into_terms(char* querystr, query** query_dict) {
    char* myquery = strdup(querystr);
    char* reentrant_saver;

    char* token;
    token = strtok_r(myquery, " \n", &reentrant_saver);
    while(token != NULL) {
        dictionary_entry* dict_entry = find_dict_entry(token);
        if(dict_entry) {
            add_term_to_query(query_dict, token, dict_entry);
        }
        token = strtok_r(NULL, " \n", &reentrant_saver);
    }
}

void print_query_struct(query** query_dict) {
    query* entry;
    for(entry=*query_dict; entry != NULL; entry=entry->hh.next) {
        fprintf(stdout, "%s: %f\n", entry->term, entry->score);
    }
}

对 print_query_struct 的调用运行良好,但对预取令牌的调用执行了一次迭代,然后崩溃:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000001000000000
0x0000000100004959 in prefetch_tokens (query_dict=0x7fff5fbffa30) at search/c_port/search.c:241
241         handle_token(entry->term);
(gdb) bt
0  0x0000000100004959 in prefetch_tokens (query_dict=0x7fff5fbffa30) at search/search.c:241
1  0x00000001000049d2 in search (querystr=0x7fff5fbffbe5 "wash") at search/search.c:255
2  0x0000000100004a20 in main (argc=2, argv=0x7fff5fbffa80) at search/search.c:263

地址,0x0000001000000000 总是一样的。

我一直在尝试各种不同的东西,但都无法奏效。 有人知道这是怎么回事吗?

结构:

typedef struct {
    char* word;
    uint32_t byte_offset;
    uint32_t occurences;
    uint32_t occurences_abstract;
    postings_entry* posting;
    UT_hash_handle hh;         /* makes this structure hashable */
} dictionary_entry;

/* query has a number of terms (strings) */
typedef struct {
    char* term;
    float score;
    dictionary_entry* dict_entry;
    UT_hash_handle hh;
} query;

编辑: 我已经简化了代码并制作了一个更小的可运行示例,但本质上,这是失败的代码:http://pastebin.com/qdDiQMG0 编译,然后用 ./binary 运行

例如。 ./binary "清洗帮助"

编辑 2: 解决了它,即使我不太明白它为什么起作用: 重写了 init_alloc_query 从:

query* init_alloc_query() {
    query* query = malloc(sizeof(query));
    query->term = NULL;
    return query;
}

像这样工作:

void init_alloc_query(query** q) {
    *q = malloc(sizeof(query));
    (*q)->term = NULL;
}

一切运行良好。

【问题讨论】:

  • 需要sscce.org
  • 我已经简化了很多代码,但本质上,这是失败的代码:pastebin.com/qdDiQMG0 编译,然后使用 ./binary 运行,例如。 ./binary "清洗帮助"
  • 我查看了您发布的代码。在“呼叫”HASH_ADD_KEYPTR 之后,myq 似乎已损坏。还不知道为什么。
  • 我现在看到了,它确实在宏运行后就损坏了。不确定这是我的代码,还是 uthash 错误?

标签: c uthash


【解决方案1】:

即使我不太明白它为什么起作用,也解决了它:重写了 init_alloc_query 来自:

query* init_alloc_query() {
    query* query = malloc(sizeof(query));
    query->term = NULL;
    return query;
}

像这样工作:

void init_alloc_query(query** q) {
    *q = malloc(sizeof(query));
    (*q)->term = NULL;
}

一切运行良好。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多