2017-06-21 48 views
-1

我有簡單的C++程序來遍歷鏈表。 它在ideone中完美運行。 當我在我的mac終端中運行它時,它會引發分段錯誤。 當我從traverse函數中取消註釋//printf("Node");時,它完美運行。我無法理解這種行爲。遍歷鏈表時出現分段錯誤

#include <iostream> 
#include <bits/stdc++.h> 
using namespace std; 
typedef struct node { 
    int data; 
    struct node *next; 
} Node; 

void traverseLinkedList(Node *start) { 
    while(start) { 
     //printf("Node"); 
     cout << start->data << "->"; 
     start = start->next; 
    } 
    cout << "NULL" << endl; 
} 
int main() { 
    Node *start = (Node*) malloc(sizeof(Node)); 
    Node *a = (Node*) malloc(sizeof(Node)); 
    Node *b = (Node*) malloc(sizeof(Node)); 
    start->data = 0; 
    a->data = 1; 
    b->data = 2; 
    start->next = a; 
    a->next = b; 
    traverseLinkedList(start); 
    traverseLinkedList(a); 
    traverseLinkedList(b); 
    return 0; 
} 
+7

你在哪裏/如何學習C++?除了'cout',這是C代碼,而不是你應該如何使用C++。 – NathanOliver

+0

不應該有任何理由在C++中使用malloc,除非您維護從C中移植的代碼。 – Lundin

+2

不包含。 不要在C++中使用malloc。 – 2017-06-21 14:33:58

回答

3

你忘了這個說法

b->next = nullptr; 

否則該計劃已未定義行爲由於功能在這個while語句的條件traverseLinkedList

while(start) 

考慮到,在C++中,應該使用運算符new而不是C函數malloc

例如

Node *b = new Node { 3, nullptr }; 
Node *a = new Node { 2, b }; 
Node *start = new Node { 1, a }; 

和退出程序之前,您應該釋放分配的內存。

+0

但爲什麼在ideone https://ideone.com/IbPspC上成功運行。這樣的指針的默認值是NULL? –

+0

@RohitPal它意味着我在回答中寫道,該程序具有未定義的行爲。 –

+0

我收到'error:expected';'聲明結束 節點* b =新節點{2,nullptr};'。對於'a'和'start'節點的init,同樣的錯誤。 –