1

我已将数据(从 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);

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

4

4 回答 4

2

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

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

这样,您将修改数据指向的值,并且更改将是持久的。

于 2013-03-02T21:47:22.603 回答
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
   }
于 2013-03-02T21:49:47.887 回答
0
void changeToNegative(void *data) {
    double* theData = (double*)data;
    *theData = (*theData) * -1.0;
}

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

于 2013-03-02T21:51:23.767 回答
0
void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

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

*data = *((double*)newData);
于 2013-03-02T21:55:28.543 回答