2013-04-20 2 views
0

У меня есть проект C, и я совершенно новый с C и средой linux.Ошибка сегментации при разных ОС

Я работаю над распределением Linux с помощью следующей системной информации

Linux BT 3.2.6 # 1 SMP Пт 17 февраля 10:34:20 EST 2012 x86_64 GNU/Linux

После компиляции с gcc, на указанной ОС, я получил ожидаемые результаты.

Перед отправкой моего проекта профессора, я думал о попытке скомпилировать и выполнить программу на другой дистрибутив Linux с следующей информацией системы

Linux feistyFawn 2.6.20-15-родовой # 2 SMP ВС Apr 15 07:36:31 UTC 2007 i686 GNU/Linux

И я получаю ошибку сегментации под этим. Чтобы проиллюстрировать выходную консоль. Вот изображения.

Работы

enter image description here

Сбой

enter image description here

Я не уверен, что теперь делать.


Код

Вызов этой функции приводит к ошибке сегментации на другой ОС.

fileInEvenements(listEvents, 'A', time, queueId); 

Что это такое - файл в событии A в структуру очереди, listEvents.

И его определение

void fileInEvenements(eventStructure *listEvents, char eventType, int time_exec, int id_queue) 
{ 
    Event *newEvent = malloc(sizeof(*newEvent)); 
    if (newEvent == NULL || listEvents == NULL){ 
     exit(EXIT_FAILURE); 
    } 

    newEvent->type = eventType; 
    newEvent->execution_time = time_exec; 
    newEvent->id = id_queue; 
    if (listEvents->firstEvent != NULL) 
    { 
     // the list contains at least one event, go to the end of list 
     Event *evCurrent = listEvents->firstEvent; 
     while (evCurrent->next != NULL) 
     { 
      evCurrent = evCurrent->next; 
     } 
     evCurrent->next = newEvent; 
    } 
    else // the list contains no event, new event becomes first event 
    { 
     listEvents->firstEvent = newEvent; 
    } 

} 
+3

Пожалуйста, покажите код, который приводит к этой ошибке. –

+1

Ваш код (вероятно) неправильный на обоих компьютерах. Вам не повезло, когда он не потерпел крушение на одном из них. –

+2

Компиляция с флагов отладки и анализ с помощью gdb – 2013-04-20 19:06:12

ответ

3

При создании новой записи в связанном списке, вы пытаетесь добавить его в список, начиная с головы и итерацию список, пока не найдете NULL в evCurrent->next. Когда вы найдете NULL, вы прекратите итерирование списка и в этот момент назначьте newEvent в качестве следующей записи в списке через evCurrent->next = newEvent; - и, конечно, если в списке нет записей, вы делаете новую запись глава списка через listEvents->firstEvent = newEvent;

Однако, ни при каких обстоятельствах вы не инициализируете значение newEvent->next. Обратите внимание: malloc() не инициализирует возвращаемый им блок памяти. Он просто выделяет блок и возвращает его вам. См. Документы здесь http://www.cplusplus.com/reference/cstdlib/malloc/

Ключ-бит ...

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

Таким образом, newEvent->next является для всех практических целей случайным значением. Таким образом, ваш код отключается в случайные проходы памяти, потому что вы рассчитываете, что он равен NULL, чтобы завершить связанный список.

Я предлагаю вам попробовать вместо этого calloc().

Evenement *newEvent = calloc(1, sizeof(*nvEvent)); 

В противном случае убедитесь, что значение элемента next инициализируется NULL при ее создании.

+0

Я не уверен, согласен ли я с вами. evActuel-> suivant должен получить адрес следующего связанного списка, и поэтому его инициализация разрушит связь структуры. Это не? – afiqjohari

+0

@afiqjohari: вы должны убедиться, что элемент 'suivant' указывает куда-нибудь - либо действительную структуру, либо NULL. Используйте ['valgrind'] (http://valgrind.org/); он должен также выявить проблемы для вас. –

+0

@afiqjohari - Подумайте об этом ... вы начинаете с 'listEvents-> firstEvent', установленного в NULL. Затем вы создаете свой первый 'newEvent' и назначаете его' listEvents-> firstEvent', но вы не инициализировали 'next' в NULL ... это какое-то случайное значение. Теперь вы идете создать новый 'newEvent', и вы проверяете' listEvents-> firstEvent' и находите, что это не 'NULL', поэтому вы проверяете' listEvents-> firstEvent-> next', чтобы узнать, является ли это 'NULL', но это какое-то случайное значение, кроме этого ... что происходит? Просто внесите изменения в 'calloc()', которые я предложил, и эта проблема исчезнет. –

1

Добавить строку:

newEvent->next = NULL; 

Использование инициализированы поля является ошибкой.

В качестве альтернативы можно использовать на следующем:

newEvent = calloc(sizeof(*newEvent), 1); // instead of malloc 

Или

memset(newEvent, 0, sizeof(*newEvent)); // set all fields to 0 
Смежные вопросы