C: Почему моя глобальная переменная не обновляется? - PullRequest
3 голосов
/ 15 октября 2011

Сегодня мне было скучно, и я решил избавиться от ржавчины в своих навыках Си, но я не могу объяснить это:

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 ]

4 голосов
/ 15 октября 2011

Вы передаете указатель узла head по значению при вызове add. Вам нужно передать указатель на указатель узла head. Таким образом, вам нужно передать &head вместо head для того, чтобы изменения были внесены в глобальный код.

Внести следующие изменения:

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

Всякий раз, когда вы ссылаетесь на head в add, вам нужно *head вместо head.

Звоните add вот так:

add(&head, &addValue);
1 голос
/ 15 октября 2011

Ваш местный 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.

0 голосов
/ 15 октября 2011

Я тоже ржавый на C, но если я правильно читаю переменные, вы не назначаете переменную GLOBAL head, вы просто передаете расположение указателя (null).Область действия переменной head в вашей процедуре строго заключается в том, что в процедуре и при изменении этого значения в процедуре add глобальное значение не изменится.Я верю, что если ты пройдешь и пойдешь, то получишь желаемый эффект.

for(addValue = 0; addValue < 10; addValue++)
{
  add(&head, &addValue);
  printf("Check 1 %x\r\n", head);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...