Я пытаюсь понять, почему я получаю ошибку (segfault) в указанной строке моего кода ниже (отмечено: <<<SEGFAULT OCCURS HERE
).Я написал это с большим вдохновением из этого поста .
Я считаю, что это проблема выделения памяти, но, учитывая, что даже когда я передаю указатель экземпляра Event в функцию enqueue, он. ошибка сегментацияУчитывая, что C передается по значению, даже когда я передаю адрес события (&event
не показан в коде, который я здесь разместил) в main функции enqueue, он должен указывать на адрес экземпляра события, который существует в main,право?Поэтому я с трудом понимаю, почему происходит ошибка сегментации.
Обратите внимание, что я ищу больше причину, по которой это происходит, а не просто решение проблемы.Я работаю над обновлением на C в конце концов.:)
Соответствующий код:
typedef struct Event_ Event;
struct Event_ {
char action[4];
long timestamp;
char* path;
char hash[9];
Event *nextEvent; // pointer to next Event instance in Queue
};
// Enqueues newEvent into queue. Returns 1 on success, 0 otherwise.
int enqueue(Event newEvent, Event **head, Event **tail) {
if (head != NULL) {
// make the old head point to the newly inserted Event,
// and the new Event to point to NULL (nothing comes before head):
(*head) -> nextEvent = &newEvent;
newEvent.nextEvent = NULL;
} else {
// first element being added to queue.
*tail = &newEvent; //<<<SEGFAULT OCCURS HERE
}
// designate the new Event as the new head:
*head = &newEvent;
return 1;
}
// Parse line and return an Event struct.
Event parseLineIntoEvent(char* line) {
Event event = {0};
char* lineSegment;
int i = 0;
lineSegment = strtok(line, " ");
while (lineSegment != NULL) {
if (i > 3) {
printf("WARNING: input format error!\n");
break;
}
if (i == 0)
strncpy(event.action, lineSegment, sizeof(event.action)-1);
else if(i == 1)
event.timestamp = atoi(lineSegment);
else if(i == 2) {
event.path = malloc(sizeof(char) * (strlen(lineSegment) + 1));
strcpy(event.path, lineSegment);
} else if(i == 3)
strncpy(event.hash, lineSegment, sizeof(event.hash)-1);
lineSegment = strtok(NULL, " ");
i++;
} // while
return event;
} // parseLineIntoEvent()
int main (int argc, const char * argv[]) {
//...
Event **head = NULL;
Event **tail = NULL;
for (; numLines > 0; numLines--) {
char *line = getLineFromStdin(); //malloced char array being returned
printf("%s\n",line);
Event event = parseLineIntoEvent(line);
if(!enqueue(event, head, tail))
printf("An error occurred when attempting to enqueue an Event.\n");
event = dequeue(head, tail);
//...
free(event.path);
free(line);
}
return 0;
}
Заранее спасибо!