C : Why isn't my global variable updating?

标签 c pointers global-variables pass-by-reference

所以我今天很无聊,决定开始我的 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/

相关文章:

c++ - 当通过引用传递成为强制通过地址/指针传递时

c - 在 C 中将 char* 反序列化为结构体

c - 缓冲区溢出攻击

c++ - 表达式 `&(*some_vector.end())` 是否定义明确?

c++ - 为什么我们在下面的代码中使用 ptr 而不是 *ptr

c - C中的全局结构体

c - 如何读取程序参数

无能为力 : Infinite Loop in C

coldfusion - 可以在 application.cfc 中创建无作用域的全局吗?

python - 如何在没有队列的情况下更改多处理中的类值?