2017-06-06 134 views
-5

我正在嘗試執行下面的代碼,但它會返回分段消息。 我試圖inizialize一個列表,然後包括第一個節點(cabecera)並打印數據,但它會返回一個分段錯誤。 請幫助我,不知道最新的問題。 預先感謝您。c中的分段錯誤

#include<stdio.h> 
#include<stdlib.h> 

typedef struct NODO{ 
    float data; 
    struct nodo* next; 
    struct nodo* before; 
} nodo; 

typedef struct CABECERA{ 
    float data; 
    struct nodo* next; 
} cabecera; 

void init(cabecera *L){ 
    L=NULL; 
} 

void pushBack(cabecera *L, float e){ 
    cabecera *newnodo; 
    newnodo= (cabecera*)malloc(sizeof(cabecera)); 
    newnodo->next= NULL; 
    newnodo->data=e; 
    L=newnodo; 
} 

int main(){ 
    cabecera *milista; 
    init(milista); 
    pushBack(milista, 0.5); 
    printf("%f\n", milista->data); 

    return 0; 
} 
+3

'void init(cabecera * L){0} {0} {0}您沒有初始化任何東西,只是將局部變量設置爲NULL。您的push_back方法也一樣。 –

+0

@ Jean-FrançoisFabreL是一個指針,爲什麼它應該是一個問題? –

+1

@Shiva:它是一個指針,但是按值傳遞。分配給'L'在該功能之外沒有效果。 – Mat

回答

0

縮進代碼。

要找到問題,請使用-g編譯您的程序並在valgrind中運行它,它會準確告訴您問題出在哪裏以及在哪裏。

總是用英文寫,它適合C的其餘部分,使其他人更容易理解和幫助你。

您沒有使用您創建的節點結構,但是無論如何您都在引用它。

#include<stdio.h> 
#include<stdlib.h>                


typedef struct NODO{                
    float data;                
    struct nodo* next;              
    struct nodo* before;              
} nodo;                   

    typedef struct CABECERA{               
    float data;                
    struct nodo* next;              
} cabecera;                  


void init(cabecera **L){               
    *L=NULL;                 
}                    



void pushBack(cabecera **L, float e){ //You want to take a pointer to your pointer          
    cabecera *newnodo;              
    newnodo= (cabecera*)malloc(sizeof(cabecera));       
    newnodo->next= NULL;              
    newnodo->data=e;               
    *L=newnodo; // Here you want to modify the VALUE of your pointer.            
}                    

int main(){                  
    cabecera *milista;              

    init(&milista); // For init (and pushBack) to modify the value of the pointer, pass a pointer to it. 

    pushBack(&milista, 0.5);             

    printf("%f\n", milista->data);           

    return 0;                
}                    

這裏(用最短路徑)和轉換到/從陣列玩具實施我做了2年前,這可以通過索引迭代左右逢源,訪問元素。 https://github.com/DusteDdk/list

+0

我剛剛開始編程,並通過您的意見看到我的程序是一個網格。非常感謝,有些部分沒有意義。 –

+0

這很好,很正常:)祝你好運,學習C是一種有益的體驗。 – DusteD