Поврежденный указатель в связанном списке - PullRequest
7 голосов
/ 02 ноября 2010

Как вы найдете, если один из указателей в связанном списке поврежден или нет?

Ответы [ 5 ]

9 голосов
/ 02 ноября 2010

Введите магическое значение в структуру вашего узла. Инициализируйте его при выделении нового узла. Перед каждым доступом проверьте, содержит ли структура узла, на которую указывает указатель, действительную магию. Если указатель указывает на нечитаемый блок данных, ваша программа потерпит крах. Для этого в Windows есть API VirtualQuery () - вызовите его перед чтением и убедитесь, что указатель указывает на читаемые данные.

3 голосов
/ 02 ноября 2010

Существует несколько возможностей.

Если список связан дважды, можно проверить обратный указатель на то, на что указывает фронтальный указатель, или наоборот.

Если у вас есть некоторыеИдея относительно диапазона ожидаемых адресов памяти вы можете проверить.Это особенно верно для связанного списка, выделенного из ограниченного числа кусков памяти, вместо того, чтобы каждый узел выделялся независимо.

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

Мне кажется, что это один из тех вопросов, где интервьюер не ожидает мгновенного ответа, а скорее анализ вопроса, включая дополнительные вопросы от вас.

1 голос
/ 02 ноября 2010

Юо мог бы хранить двусвязный список.Затем вы можете проверить этот узел-> child-> parent == node (хотя, если node-> child испортился, у него есть достаточный шанс вызвать исключение)

1 голос
/ 02 ноября 2010

Это своего рода боль, но вы можете записывать значения каждого указателя, когда вы сталкиваетесь с ними с помощью отладчика, и проверять, что это соответствует тому, что вы ожидаете найти (если вы ожидаете, что указатель будет NULL, убедитесь, что оно равно NULL. если вы ожидаете, что указатель ссылается на уже существующий объект, убедитесь, что адрес этого объекта имеет это значение и т. д.).

0 голосов
/ 02 ноября 2010

Несколько отладчиков / связанных контролеров сделают это за вас, но дешевое и быстрое решение этого вопроса состоит в том, чтобы

  • Измените структуру узлов списка, чтобы включить один дополнительный символ [n].field (или, более типично, два, одно как первое, другое как последние поля в структуре, что позволяет проверять границы в дополнение к повреждению указателя).
  • Инициализировать эти поля короткими (но достаточно длинными)...) константная строка, такая как «VaL1D-LiST-NODE 1234», когда создаются узлы.
  • Убедитесь, что значения, считанные в этом (этих) полях, соответствуют ожидаемому тексту каждый раз, когда узелразыменовывается, и перед использованием узла всерьез.

Если значения полей не совпадают, это также указывает на то, что:

  • указательнедопустимый (он никогда не указывал на узел списка)
  • что-то еще перезаписывает структуру узла (указатель «действителен», но данные, на которые он указывает, повреждены).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...