Гах, указатели скрыты за 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, вы вызывали неопределенное поведение где-то еще в вашем коде).
Короче говоря, проблема не в том коде, который вы опубликовали.Это, вероятно, где вы размещаете и назначаете элементы списка.