Сегментация С - PullRequest
       3

Сегментация С

1 голос
/ 28 января 2012

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

У меня есть односвязный список следующих структур, чьи идентификаторы являются последовательными, начиная с 0:

typedef struct basic_block_struct
{
    int id;
    bit_vector *dominators;
    struct basic_block_struct *next;
} basic_block;

Позже, когда нужно много искать в списке, я пытаюсь использовать массив указателей на каждый блок в списке, чтобы воспользоваться преимуществами индексации. Между идентификаторами блоков и индексами массива должно быть однозначное соответствие:

basic_block **dom_array = (basic_block **)malloc(num_bb * sizeof(basic_block *));

basic_block *search_bb;
search_bb = head; //The head of the list of blocks

while (search_bb != NULL)
{
    dom_array[search_bb->id] = &*search_bb; //Not sure the &* is needed
    search_bb = search_bb->next;
}

set_bit(dom_array[0]->dominators, 0, TRUE);

Это определенно последняя строка, которая вызывает ошибку сегмента. Вызов функции является допустимым - он просто устанавливает первый бит (бит 0) "доминаторов" bit_vector в первом блоке - но, похоже, он не указывает на basic_block.

Любой совет приветствуется.

Привет.

Ответы [ 2 ]

1 голос
/ 29 января 2012

Всякий раз, когда вы получаете ошибку сегментации и не можете увидеть ответ менее чем за минуту, используйте valgrind.Вот учебник valgrind, который показывает, что он может делать .Объектно-ориентированные программисты используют модульные тесты каждый раз, когда они меняют свой код.Программисты на Си должны использовать valgrind таким же образом.

0 голосов
/ 28 января 2012

Ах, загадка раскрыта. Я перехитрил себя. Этот бит_вектор никогда не выделяется. : - (

...