Я пытаюсь просто перевернуть одноуровневый список, но с небольшим завихрением. Вместо того, чтобы указатель на следующий узел был фактическим следующим узлом, он указывает на указатель в следующем узле.Segfault при доступе к следующему узлу в одиночном списке
struct _Node
{
union
{
int n;
char c;
} val;
void *ptr; /* points to ptr variable in next node, not beginning */
int var;
};
typedef struct _Node Node;
Я знаю, как обратный нормальный односвязан список, и я думаю, что у меня есть общее представление о том, как идти о решении этого, но я получаю Segfault, когда я пытаюсь получить доступ к head->ptr
и Я не знаю почему.
Node *reverse(Node *head)
{
Node * temp;
Node * prev = NULL;
while(head != NULL)
{
temp = head->ptr + 4; /* add 4 to pass union and get beginning of next node */
head->ptr = prev;
prev = head;
head = temp;
}
return prev;
}
Даже если я пытаюсь и доступ head->ptr
без добавления 4, я получаю Segfault.
Драйвер, который у меня есть для этого кода, является только объектным файлом, поэтому я не вижу, как вещи вызываются или что-то в этом роде. Я либо пропускаю что-то явно очевидное, либо есть проблема в драйвере.
ОК, чтобы уточнить: head-> prev указывает на «some_other_node.ptr»? –
Если вы уточните, что указывает ptr, тогда это правильно. – John
У вас есть веская причина для того, чтобы элемент 'ptr' указывал на элемент' ptr' следующего элемента в списке, вместо того, чтобы делать что-то обычным, разумным, простым, относительно надежным способом, который бы сделала любая нормальная программа , и имеет 'ptr' (вероятно, переименован как' next' и, вероятно, не из типа 'void *', поскольку тип добавляет еще один уровень сложности или не-переносимости), указывающий на начало следующего элемента в списке? Это кажется порочным. Единственное оправдание, которое я могу придумать, - «Садистский учитель, диктовал это». В противном случае это вряд ли будет разумным решением. –