[英]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.