C:为什么我的全局变量没有更新?

时间:2011-10-14 22:14:53

标签: 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()函数中更新我的全局指针,但是在函数调用结束后还原它呢?

3 个答案:

答案 0 :(得分:4)

当您调用head时,您正在按值传递节点指针add。您需要将指针传递给节点指针head。因此,您需要传递&head而不是head才能对全局进行修改。

进行以下更改:

void add(Node_t** head, void* data)

每当您在head中引用add时,您需要*head而不是head

像这样呼叫add

add(&head, &addValue);

答案 1 :(得分:1)

您的本地head正在使全球head黯然失色。考虑这个简化的片段:

int head;
void add(int head) {
    head = 7;  // analog to head=malloc() in your case
    printf("head=%d\n", head);
}
int main() {
    add(head);
    printf("head=%d\n", head);
    return 0;
}

从这个简单的案例中可以明显看出,更新head中的局部变量add对全局变量head完全没有任何意义。

答案 2 :(得分:0)

我在C上也生锈了但是如果我正确地读取变量你没有分配GLOBAL变量头,你只是传递指针的位置(null)。过程中head变量的范围是严格的,在过程中并且在add过程中更改该值不会更改全局值。我相信如果你通过并且头脑,你将获得理想的效果。

for(addValue = 0; addValue < 10; addValue++)
{
  add(&head, &addValue);
  printf("Check 1 %x\r\n", head);
}