初学者C指针问题

时间:2011-06-06 02:03:35

标签: c string pointers

我是新用户,指针有问题。

函数 add_word(* word_to_add)应采用c字符串并将其添加到相应的word_node链表中。但是,后续添加似乎会覆盖哈希表中所有节点的单词元素。我认为这种情况正在发生,因为我将每个节点的word元素设置为指向word_to_add的指针,而不是复制word_to_add的值。

#define HASH_TABLE_SIZE 10
static char **word_list;

struct word_node {
    char* word;
    struct word_node *next;
};

static struct word_node *word_hash_table[HASH_TABLE_SIZE];

static int hash(char *word) {
    int ascii_char;
    int key;

    key = 0;
    while (*word != '\0') {
        ascii_char = tolower(*word);
        key += ascii_char;
        word++;
    }
    key %= HASH_TABLE_SIZE;
    return key;
}


void ws_add_word(char *word_to_add)
{
    int word_position;


    word_position = hash(word_to_add);

    if (word_hash_table[word_position] == NULL)
    {
        struct word_node* p;
        p = malloc(sizeof(struct word_node));;
        p->word = word_to_add;
        p->next = NULL;
        word_hash_table[word_position] = p;
        ++num_words;
    } else {
        struct word_node* p;
        p = word_hash_table[word_position];

        while (p->next != NULL)
        {   
            p = p->next;
        }

        struct word_node* q;
        q = malloc(sizeof(struct word_node));
        q->word = word_to_add;
        q->next = NULL;
        p->next = q;
        ++num_words;
    }

4 个答案:

答案 0 :(得分:1)

我认为你的代码是正常的。如果您遇到问题,可能就是您如何调用该功能。例如,这是一个快速&肮脏的样本:

#include <stdio.h>
#include <stdlib.h>

int num_words;

/* paste sample code here */
#define HASH_TABLE_SIZE 10
// rest of code
void ws_add_word(char *word_to_add)
{
    // function code
}
/* end of sample code */

int main (void)
{
    char a[] = "Hello";
    char b[] = "Helkp"; // chosen to have the same hash result

    ws_add_word((char *)&a);
    ws_add_word((char *)&b);

}

我使用gcc -g进行了编译并浏览了gdb。这样做并单步执行ws_add_word并检查word_hash_table的内容似乎就是你想做的。如果它仍然不起作用,您应该举例说明您如何调用ws_add_word

此外,如果您只是使用p->word = word_to_add更改strcpy(p->word,word_to_add),则可能会出现段错误,因为p->word尚未设置为有意义的任何内容。您需要p->word = (char *)malloc(N) N足够大,然后strcpy,如果这是您真正想做的事情。是否需要取决于char *word_to_add指向的内存位置在下次需要使用时是否有效。

答案 1 :(得分:0)

对我来说很好,除了ws_add_word中的第10行。

更改

q->word = word_to_add; 

p->word = word_to_add; 

答案 2 :(得分:0)

你不能只把两个字符串或字符指针等同于:

char* p1, p2;
p1=p2; // THIS IS INVALID

在您的代码中,您犯了两次错误: -

p->word = word_to_add;

q->word = word_to_add;

这表示你正在将p-&gt;字指向word_to_add这是一个指针。它将开始引用相同的对象,但不会复制你期望的字符串。 它不会将word_to_add的内容复制到q-&gt; word,您可以这样做。

您需要使用任何字符串复制功能复制字符串,例如:strcpy,strncpy或memcpy。

替换p-&gt; word = word_to_add
strcpy(p->word,word_to_add);

和类似的

替换q-&gt; word = word_to_add
strcpy(q->word,word_to_add);

-

氪。阿洛克

答案 3 :(得分:0)

节点的char指针'word'似乎指向原始字符串,而不是持有自己的副本。只要原始字符串不变,这就没问题。例如:

//Assume word_to_add is "String 1"

p->word = word_to_add;

//Now change word_to_add to "String 2"
//After this p->word would be "String 2"

我不知道这是不是预期的行为。您可能希望为节点结构中的每个“单词”指针分配内存,并复制word_to_add字符串。

相关问题