【问题标题】:C : Why isn't my global variable updating?C : 为什么我的全局变量没有更新?
【发布时间】:2011-12-08 02:49:02
【问题描述】:

所以我今天很无聊,决定开始我的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() 函数中更新我的全局指针,但在函数调用结束后恢复它呢?

【问题讨论】:

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


    【解决方案1】:

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

    进行这些更改:

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

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

    像这样拨打add

    add(&head, &addValue);
    

    【讨论】:

    • 谢谢,我刚刚发现我正在查看全局变量的副本,而全局指针本身实际上并没有被设置。
    • 很好的答案,但进一步看这个问题让我感到困惑 - 如果这是添加到列表中,就像看起来一样,那么确实 head 应该 not 改变所以问题本身就有错误。
    • @Stephen 添加第一个节点时需要分配给head
    • 另外,我认为我在这里的一半困惑来自于我为该局部变量和全局变量使用相同的名称。这绝对应该改变。
    • @David - 我只是意识到这是必须修改 head 的情况......我没有在 C 中这样工作 - 我可能会这样做 LIST_HANDLE mylist = list_new() 然后 @987654336 @(这就是为什么我第一次很难弄清楚 OOP 到底做了什么)
    【解决方案2】:

    您的本地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;
    }
    

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

    【讨论】:

      【解决方案3】:

      我对 C 也很生疏,但是如果我正确读取变量,则您没有分配 GLOBAL 变量头,您只是传递了指针的位置(空)。程序中头变量的范围严格来说是,在程序中并在添加程序中更改该值不会更改全局值。我相信如果你通过 &head 你会得到想要的效果。

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

      【讨论】:

        猜你喜欢
        • 2019-04-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 2019-07-24
        相关资源
        最近更新 更多