我已经为每个节点添加了数据(从1.0到9.0的双值)。现在我试图访问每个数据来修改它,以便每个节点中的double值为负(-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);
然而,它仍然只打印出正值......我正在为数据重新分配一个新的内存位置,所以我不明白它是如何仍然指向旧的内存位置。任何帮助表示赞赏!
答案 0 :(得分:2)
修改您的代码,如下所示。而不是将指针分配给数据分配值,如下所示
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
}
答案 2 :(得分:0)
void changeToNegative(void *data) {
double* theData = (double*)data;
*theData = (*theData) * -1.0;
}
您在data
函数中分配了changeToNegative
的本地副本,其中包含已修改数据的地址,这些副本不会反映在调用者的函数中。而是取消引用和修改就地data
,以便将更改反映回调用者。
答案 3 :(得分:0)
void changeToNegative(void *data) {
double newData = *((double*)data) * -1.0;
data = &newData;
}
此函数的最后一行将名为data
的指针设置为指向一个新位置,而不是最初传递给该函数的位置。 不会影响存储在原始内存位置的数据。相反,您想要取消引用指针并将其设置为新值:
*data = *((double*)newData);