c - 再次通过引用传递

标签 c pass-by-reference

我编写这段代码是为了创建一个单词词典。每个单词只能存在一个;如果是,则相应的计数器递增。如果该单词在字典中,则调用 strcmp() 方法并交换指针。

我的问题是,当调用我的函数时,它使用 strcmp(),但每次我这样做时,*wordArr 根本没有被修改。因此,每次代码运行时,它都会与“”进行比较,“”自动为<任何单词。

有人能给我指出正确的方向吗?

void placeWord(struct wordNode *words,char *tempW)
{
   int value;

    if(uniqueWordCount==0)  //HEAD
    {
       words = createNewWord(tempW);
    }   

    else ///SEARCHING AND AMMEND
    {
      while(1)
        {   
            value = strcmp(words->word,tempW);
            if(value<0)
            {
                words =createNewWord(tempW);
                (words-1)->next= words;
                words->prev = (words-1);
                break;
            }
            else if(value==0)
            {
                (words->howmany)++;
                wordCount++;
                break;
            }
         words=words->next;
            if(words->next!=NULL)
                break;
        }
    }
}
.
.
.
.
}

int main(){
.
.
.  struct wordNode *wordArr =(struct wordNode* )malloc(size * sizeof(struct wordNode));


   placeWord(wordArr,tempW);
.
.
.
}

最佳答案

我认为最大的问题是你在 placeWord() 中对单词的分配。严格来说,C 中的所有参数都是按值传递的。要模拟按引用传递,您需要传递对变量的引用,并在函数中取消引用它。 (也就是说,传入 &wordArr 并将单词参数的类型更改为 struct wordNode **。)然后您可以将当前单词存储在变量中:

void placeWord(struct wordNode **words, char *tempWord) {
    struct wordNode *currWordNode = *words;

}

要实际更改列表开头的值,您必须执行以下操作:

newHeadNode->next = *words;  // If there was a previous head node.
*words = newHeadNode;

另请注意,如果您不修改链表的头部,则必须跟踪前一个节点并将 prevNode->next 设置为您要插入的 wordNode。简单地分配给您用来跟踪列表中当前元素的变量是行不通的。

关于c - 再次通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11489103/

相关文章:

c - 如果在其他函数中递增,则指针不会递增

c - AVR Butterfly UART - 无法接收数据

c++ - 按值传递或按引用传递

r - 使用 r 中的常见随机数进行采样(高效!)

c++ - 如何将指针传递给函数并在函数 C++ 中动态分配内存

c++ - 通过 read 函数而不是 fread 读取标准输出

c - C 程序中的文本文件到位图

c++ - 使用 GLee(GL Easy Extension Library)构建错误

java - 递归和按引用传递参数

c++ - 将 Ref 返回给局部变量