2015-01-26 2 views
0

Я хочу написать функцию в C++ о поиске узла пересечения из 2 связанных списков.Странная ошибка компиляции при назначении указателей в части приращения для C++ для цикла

Определение LinkedList является тривиальным, как сильфонные:

struct ListNode { 
    int val; 
    ListNode *next; 
    ListNode(int x) : val(x), next(NULL) {} 
}; 

Моей идея заключается в цикле по 2 спискам и найти последний иной узел.

Все переменные: ListNode указатели.

Проблема происходит, когда я пытался поставить pa = headA и pb = headB вверх в приращению части для цикла, как это:

for (int i = 0; i < min_len; i++, pa = headA, pb = headB) { 

    while (pa->next != last_same_node) pa = pa->next; 
    while (pb->next != last_same_node) pb = pb->next; 

    if (pa != pb) break; 
    else last_same_node = pa; 
} 

Он работал хорошо, когда я положил их так:

for (int i = 0; i < min_len; i++) { 

    pa = headA; 
    pb = headB; 

    while (pa->next != last_same_node) pa = pa->next; 
    while (pb->next != last_same_node) pb = pb->next; 

    if (pa != pb) break; 
    else last_same_node = pa; 
} 

Сообщение об ошибке VC дало мне следующее:

First-chance exception at 0x00BD34B7 in leetcode.exe: 
0xC0000005: Access violation reading location 0x00000004. 

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

+6

Это не ошибка компилятора ... – deviantfan

+0

Это исключение, вызванное вашим приложением, потому что вы пытались прочитать неустойчивое расположение памяти. Проверьте использование памяти простым чтением кода, отладчиком или valgrind. –

+0

Это временная ошибка *. Запустите debug-build в отладчике, и отладчик остановится в месте сбоя. Затем отладчик позволит вам изучить стек вызовов функций и позволить вам подойти к стеку вызовов до тех пор, пока вы не достигнете своего кода (если вас там уже нет), где вы можете изучить значения переменных. –

ответ

3

Первая версия выполняет только линии между итерациями цикла. Вторая версия выполняет их на каждой итерации цикла. Разница в том, что вторая версия выполняет их на первой итерации, а в первой версии нет.

+0

Спасибо, это интуитивно понятно и помогло мне понять эту проблему. – Kun