我試圖去通過一個鏈表中C.C連接列表:在Windows分段故障,在Mac
列表項被定義爲
struct list_element {
struct list_element *next;
int value;
};
列表頭定義作爲
struct list_head {
struct list_element *front;
struct list_element *end;
};
,我試圖打印這樣
void printList(struct list_head* head) {
if(head == NULL|| head->front == NULL) {
printf("List is empty \n");
return 0;
}
struct list_element* elm = head-> front;
int numberOfElements = 0;
while(elm != NULL) {
printf("%i", elm -> value);
printf(" ");
elm = elm -> next;
}
printf("\n");
}
項目0
這適用於我的Mac在XCode和https://ideone.com,但在Windows和http://codepad.org它導致「分段錯誤」。看起來好像
while(elm != NULL) {
printf("%i", elm -> value);
printf(" ");
elm = elm -> next;
}
導致一些問題。它看起來像榆樹沒有指向最後一項NULL,即使它應該。
我加入的項目,如本
struct list_element* list_push(struct list_head* head) {
//List head is null
if(!head) {
return NULL;
}
//Initialize list element
struct list_element* elm = malloc(sizeof(struct list_element));
if(elm == NULL) {
//Couldn't alloc memory
return NULL;
}
if(head->front) {
head->front = elm;
head->end = elm;
} else {
//List head is not null, set next elm to point to current elm
elm -> next = head -> front;
head->front = elm;
}
return elm;
}
我很認真地困惑,爲什麼相同的代碼會在一些地方而不是在別人打工。 (它的工作原理上IDEone和XCode的,它不會對鍵盤和Code :: Blocks的Windows上使用相同的代碼工作)與NULL
爲第一要素
Example on IDEone Example on Codepad
在XCode中調試不會顯示任何錯誤,也不會顯示valgrind。但運行編譯的二進制結果在分段錯誤 – Simon
通常,如果您的程序在一臺計算機上發生段錯誤,似乎在另一臺計算機上「工作」,那麼它會顯示「未定義的行爲」。谷歌「未定義的行爲C」瞭解更多。 –