簡體   English   中英

C:為什么我的全局變量沒有更新?

[英]C : Why isn't my global variable updating?

所以今天我很無聊,並決定開始我的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()函數中更新我的全局指針,但是一旦函數調用結束就恢復它?

你是路過的節點指針head的價值,當你調用add 您需要將指針傳遞給節點指針head 所以你需要傳遞&head而不是head ,以便對全局進行修改。

進行以下更改:

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

每當你指的headadd你需要*head ,而不是head

呼叫add如下:

add(&head, &addValue);

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

至於應該是顯而易見的,從這個簡單的例子,更新本地變量headadd絕對沒有全局變量head

我也在C上生銹,但如果我正確地讀取變量你沒有分配GLOBAL變量頭,你只是傳遞指針的位置(null)。 過程中head變量的范圍是嚴格的,在過程中並且在add過程中更改該值不會更改全局值。 我相信如果你通過和頭部,你將獲得理想的影響。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM