我有一个文本文件和一种从文本文件中读取单词的方法。该单词存储在char数组中,然后运送到函数以存储在树的节点中。然后,重置该单词并重新开始该过程。但是,当我检查树时,所有节点都引用相同的字符串。
得到消息:
node* run(node* root)
{
char c;
int index = 0;
char word[100];
fp = fopen("text.txt","rt");
do
{
c = (char)fgetc(fp);
if(c == ' ' || c == '\n' || c == '\0' || c == '\t' || c == ',' || c == ';' || c == '.' || c == '?' || c == '!' || c == ':')
{
root = insert(root, word);
word[0] = 0;
index = 0;
}
else
{
word[index++] = c;
word[index] = 0;
}
}while(c != EOF);
fclose(fp);
return root;
}
使用insert中的单词做一些事情:
node* insert(node* N, char* key)
{
/* 1. Perform the normal BST rotation */
if (N == NULL)
return(newNode(key));
...
}
从字符串中创建一个新节点:
node* newNode(char* string)
{
node* newNode = (node*) malloc(sizeof(node));
newNode->data = string;
newNode->left = NULL;
newNode->right = NULL;
newNode->height = 1; //Height of a leaf is one
return(newNode);
}
然而,在我添加newNode并重置我的单词之后,root中的数据值会更改为原始单词更改为...我猜猜指针有什么奇怪的事情?基本上,我如何将newNode->数据分配给字符串AT THE CURRENT MOMENT的值而不是其永恒值。
答案 0 :(得分:3)
那是因为您在创建每个节点时都使用word
,这只存储了word
中第一个字符的地址。
更改
newNode->data = string;
到
newNode->data = strdup(string);
答案 1 :(得分:-1)
我认为发生的是你在run方法的开头创建一个指针。您只需分配一次内存。然后所有节点都指向内存中完全相同的位置。无论何时更改存储在该指针处的字符串,它都将针对所有节点进行更改。
// Allocation of memory only once
char word[100];
将字符串分配给节点并复制字符串时,需要执行新的分配。 像这样:
char copy[100];
strcopy(copy, word);
insert(root, word);
我希望这会有所帮助:)