2017-06-06 135 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