我想了解爲什麼我在下面的代碼的指定行(出現於:<<<SEGFAULT OCCURS HERE
)中獲得段錯誤。我從this post獲得了很多靈感。試圖瞭解此分段錯誤
我認爲這是一個內存分配問題,但考慮到即使我將一個Event實例的指針傳遞給enqueue函數,它仍然存在段錯誤。考慮到C是按值傳遞的,即使當我將main中的事件地址(&event
未顯示在此處的代碼中)傳遞給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;
}
提前感謝!
'enqueue'函數被打破。您通過值傳遞'newEvent',這不會修改您傳遞的事件。 – pmr 2012-01-17 23:39:27