所以我今天很无聊,决定开始我的 C 技能生锈,但我无法解释这一点:
typedef struct Node
{
struct Node* prev;
struct Node* next;
void* data;
} Node_t;
Node_t* head = NULL;
void add(Node_t* head, void* data)
{
Node_t* newNode = (Node_t*)malloc(sizeof(Node_t));
Node_t* iterate = head;
newNode->next = newNode->prev = NULL;
newNode->data = data;
if(head == NULL)
{
/*printf("Check 0 %x\r\n", newNode);*/
head = (Node_t*)malloc(sizeof(Node_t));
head->next = head->prev = NULL;
head->data = data;
printf("Check 0.5 %x\r\n", newNode);
}
else
{
while(iterate->next != NULL)
{
iterate = iterate->next;
}
iterate->next = newNode;
newNode->prev = iterate;
}
}
int main(int argc, char** argv)
{
int addValue = 0;
int* printMe = 0;
Node_t* iterate;
for(addValue = 0; addValue < 10; addValue++)
{
add(head, &addValue);
printf("Check 1 %x\r\n", head);
}
........
printf 语句打印我的头指向的内存位置。每次从 Add() 函数调用它时,它都会打印一些合理的内存位置,但一旦返回,它就会打印 0 (NULL) 作为指针的值。两个打印语句紧接着另一个。那么为什么 C 在 Add() 函数中更新我的全局指针,但在该函数调用结束后恢复它?
最佳答案
当您调用 add
时,您正在按值传递节点指针 head
。您需要将一个指针 传递给节点指针head
。因此您需要传递 &head
而不是 head
以便对全局进行修改。
进行这些更改:
void add(Node_t** head, void* data)
每当您在 add
中引用 head
时,您需要 *head
而不是 head
。
像这样调用add
:
add(&head, &addValue);
关于C : Why isn't my global variable updating?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7774144/