我已经向每个节点添加了数据(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);
然而,它仍然只打印出正值。。。我正在为数据重新分配一个新的内存位置,所以我不明白它是如何指向旧的内存位置的。感谢您的帮助!
如下修改代码。不是将指针分配给数据,而是将值分配给
void changeToNegative(void *data) {
double newData = *((double*)data) * -1.0;
*data = newData;
}
通过这种方式,您将修改数据所指向的值,并且更改将是持久的。
您的错误:
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
}
void changeToNegative(void *data) {
double newData = *((double*)data) * -1.0;
data = &newData;
}
此函数的最后一行将名为data
的指针设置为指向一个新位置,而不是最初传递给该函数的位置。它不会影响存储在原始内存位置的数据。相反,您希望取消引用指针并将其设置为新值:
*data = *((double*)newData);
void changeToNegative(void *data) {
double* theData = (double*)data;
*theData = (*theData) * -1.0;
}
您在changeToNegative
函数中为data
的本地副本分配了修改数据的地址,该地址不会反映在调用方的函数中。相反,取消引用并修改data
,以便将更改反映回调用者。