Странный побочный эффект при использовании оператора '->' в c - PullRequest
0 голосов
/ 22 апреля 2011

Я получаю этот странный побочный эффект при использовании оператора '->' в коде, который я написал на C. Указатель, который я использовал -> on, изменен, чтобы иметь некоторый мусор.

Более конкретно:

У меня есть следующие структуры:

typedef void* ListElement ;

typedef  struct List_t* List ;

typedef struct Node_t* Node;

Struct Node_t {
  ListElement data ;
  Node next;
}

Struct List_t {
  Node* head;
  Node* current
}

, когда я использую следующее ListGetFirst(), я получаю проводное поведение:

ListElement ListGetFirst(List list)
{
  if( list == NULL || list->head==NULL)
  {
    return NULL;
  }
  list->current=list->head;
  Node* head =list->head; // here is the problem
  ListElement data = (*head)->data;
  return data;
}

, когда я использовал отладчик, я понял, чтосписок указателей -> заголовок изменен в отмеченной вышеупомянутой строке.

Я действительно понятия не имею, почему, и я не знал, что '->' может иметь побочный эффект

спасибо ваванс

Ответы [ 3 ]

9 голосов
/ 22 апреля 2011

Вы уверены, что это именно то, что вы хотите сделать?

typedef struct Node_t* Node;

Node* head =list->head; 

Поскольку вы определили Node как указатель на Node_t, вам не следует делать:

Node head =list->head; 

EDIT

Подводя итог, я думаю, что этот typedef вводит вас в заблуждение:

typedef struct Node_t* Node;

Было бы больше смысла, если бы это было просто:

typedef struct Node_t Node;
4 голосов
/ 22 апреля 2011

Гах, указатели скрыты за typedefs;если тип не должен быть полностью непрозрачным, это почти всегда плохо джиу.Для моей пользы я собираюсь убрать typedef, чтобы мне было легче увидеть, с чем вы действительно играете.

struct Node_t {   
  void *data ;   
  struct Node_t *next; 
};

struct List_t {   
  struct Node_t **head;   
  struct Node_t **current; 
};

void *ListGetFirst(struct List_t *list)
{
  if( list == NULL || list->head==NULL
  {        
     return NULL;
  }
  list->current=list->head;             
  struct Node_t **head =list->head; // here is the problem
  void *data = (*head)->data;
  return data;           
}           

Я получил nuthin '.Все типы совпадают.Оператор -> наиболее определенно не имеет побочных эффектов;все, что он делает, это разыменовывает указатель.Дополнительный уровень косвенности для head и current в struct List_t вызывает головокружение, и меня удивляет, правильно ли они распределяются или назначаются.Все, что я могу понять, это то, что list->head не указывает на память, которой вы на самом деле владеете, а как-то перезаписывается, когда вы достигаете этой точки (IOW, вы вызывали неопределенное поведение где-то еще в вашем коде).

Короче говоря, проблема не в том коде, который вы опубликовали.Это, вероятно, где вы размещаете и назначаете элементы списка.

1 голос
/ 22 апреля 2011

Вы используете указатели на указатели, где, скорее всего, вам нужны указатели.

В List_t вы определяете head как Node *, где Node уже является Node_t *.

НТН

Mario

...