【问题标题】:Trying to change data in Linked List nodes尝试更改链表节点中的数据
【发布时间】:2013-03-02 21:45:17
【问题描述】:

我已向每个节点添加数据(从 1.0 到 9.0 的双精度值)。现在我正在尝试访问每个数据以对其进行修改,以便每个节点中的双精度值都是负数(-1.0 到 -9.0):

void traverseList(struct List *list, void (*func) (void *)) {
    struct Node *current = list->head;
    while(current) {
        func(current->data);
        current = current->next;
    }
}

void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

我用以下方式调用上述内容:

traverseList(&list, &changeToNegative);
traverseList(&list, &print);

但是,它仍然只打印出正值...我正在为数据重新分配一个新的内存位置,所以我不明白它如何仍然指向旧的内存位置。任何帮助表示赞赏!

【问题讨论】:

  • Node 的声明是什么?
  • 结构节点 { void *data;结构节点*下一个; };
  • 请举例说明您如何创建和使用您的List。下面选择的解决方案是正确的,但不完整,因为您的问题缺少重要的细节,我们无法提供完整的答案。

标签: c pointers linked-list nodes


【解决方案1】:

如下修改您的代码。而不是将指针分配给数据分配值,如下所示

void changeToNegative(void *data) {
   double newData = *((double*)data) * -1.0;
   *data = newData;
}

这样您将修改数据指向的值,并且更改将保持不变。

【讨论】:

  • +1 以获得正确的解决方案。我的猜测是,反对票是针对仅包含代码的原始答​​案。
【解决方案2】:

您的错误:

void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

在函数changeToNegative(void *data) 中,您正在修改data。当你要修改*data。 请参阅参数是void* data,它是按地址传递的,以便反映调用函数的变化。

只是喜欢:

   void changeToNegative(void *data) { 
      *((double*)data) *=-1;   // nagt value pointed data pointer
   }

【讨论】:

  • 原始代码不会“返回”任何内容,即使您对这个词的定义很松散。它改变了局部变量(指针)的值,但不改变指针最初指向的内存的值。
  • 谢谢。完全是 C 的新手,找到指针有点困难。
  • @Code-Guru: 好吧……这完全取决于你对作者为什么会做错误代码的想法:尝试为指向的内存分配一个新值,或者尝试分配一个新的指向具有修改后值的新内存的指针。
  • +1 这是迄今为止最正确的答案,因为从void*double* 的演员阵容。但是,很难确定,因为 OP 没有包含足够的信息来确保 data 确实指向 double
  • @Code-Guru Ah Code-Guru 当我来到这篇文章时,我看到问题已经得到解答。 qPCR4vir 的回答很好,但我觉得如果我添加更多单词,OP 会发现它很有帮助。一起努力寻找好的答案很有趣:)
【解决方案3】:
void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

此函数的最后一行将名为data指针 设置为指向一个新位置,而不是最初传递给该函数的位置。它确实影响存储在原始内存位置的数据。相反,您想取消引用指针并将其设置为新值:

*data = *((double*)newData);

【讨论】:

  • 为什么在编译具有上述更改的代码时我收到以下错误:警告:取消引用'void *'指针[默认启用] mylist.c:110:5:错误:无效使用空虚的表达
  • @user1889966 因为我建议的解决方案不正确。不过,为了修正我的答案,我需要更多细节。请参阅我对您的问题的评论。
  • 我不会发布我的所有代码,但感谢您的洞察力,我对自己的错误以及指针的工作原理有了更好的了解。
  • 我认为问题在于 newData 是 double 类型。因此,将其分配给 void 类型的数据会导致错误。
  • @user1889966 你是正确的,你不能将double 值赋给void 类型的变量,如果这样的事情甚至存在的话。在赋值运算符之前会出现另一个问题:您不能将 * 解引用运算符与 void* 变量一起使用。我将编辑我的答案以显示如何解决此问题。
【解决方案4】:
void changeToNegative(void *data) {
    double* theData = (double*)data;
    *theData = (*theData) * -1.0;
}

您在 changeToNegative 函数中使用修改数据的地址分配了 data 的本地副本,这不会反映在调用者的函数中。而是取消引用并就地修改data,以便将更改反映回调用者。

【讨论】:

  • 指针乘以-1是什么意思?这甚至可以编译吗?
  • 另外,原始代码返回局部变量的地址。它将一个局部指针变量设置为指向另一个局部变量,这是完全有效的,但不符合 OP 的要求。
  • 完全有效,你的意思是编译器不会抱怨?从函数返回,栈上变量的地址不是你任何时候都想做的事情。
  • OP的代码中没有return语句;它设置一个局部指针来指向一个定义良好的局部变量。您提到的运行时错误不适用于此处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多