簡體   English   中英

初學者C指針問題

[英]Beginner C Pointer Problem

我是新的 C 用戶,指針有問題。

function add_word(*word_to_add)應該采用 c 字符串並將其添加到適當的 word_node 鏈表中。 但是,隨后的添加似乎覆蓋了 hash 表中所有節點的 word 元素。 我認為這是因為我將每個節點 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;
    }

我認為你的代碼是好的。 如果您遇到問題,可能與您調用 function 的方式有關。 例如,這是一個快速而骯臟的示例:

#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

此外,如果您只是用strcpy(p->word,word_to_add)更改p->word = word_to_add ,您可能會遇到段錯誤,因為p->word尚未設置為任何有意義的值。 你需要p->word = (char *)malloc(N)其中N足夠大,然后是strcpy ,如果那是你真正想做的。 想不想,就看你下次需要用到char *word_to_add指向的memory位置是否有效。

節點的 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”指針分配 memory 並復制 word_to_add 字符串。

對我來說看起來不錯,除了 ws_add_word 中的第 10 行。

改變

q->word = word_to_add; 

p->word = word_to_add; 

您不能僅將兩個字符串或字符指針等同起來,例如:

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

在您的代碼中,您犯了兩次此錯誤:-

p->word = word_to_add;

q->word = word_to_add;

這表示您正在使 p->word 指向 word_to_add 這是一個指針。它將開始引用相同的 object 但不會復制您期望的字符串。 它不會將 word_to_add 的內容復制到您假設已完成的 q->word 中。

您需要使用任何字符串副本 function 來復制字符串,例如:strcpy、strncpy 或 memcpy。

替換 p->word = word_to_add 為

strcpy(p->word,word_to_add);

同樣地

替換 q->word = word_to_add 為

strcpy(q->word,word_to_add);

--

氪。 阿洛克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM