【问题标题】:Segmentation error in cc中的分段错误
【发布时间】:2017-06-06 12:29:46
【问题描述】:

我正在尝试执行下面的代码,但它会返回一条分段消息。 我正在尝试初始化一个列表,然后包含第一个节点(cabecera)并打印数据,但它会返回一个分段错误。 请帮助我,不知道是什么问题。 提前谢谢你。

#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;
}

【问题讨论】:

  • void init(cabecera *L){ L=NULL; 你没有初始化任何东西,你只是将一个局部变量设置为NULL。你的 push_back 方法也是如此。
  • @Jean-FrançoisFabre L 是指针,为什么会成为问题?
  • @Shiva:它是一个指针,但按值传递。分配给 L 在该函数之外没有任何影响。
  • @Shiva 因为在main 他们试图访问一个不指向任何地方的结构指针的成员
  • 另外,pushBack 正在泄漏内存

标签: c list


【解决方案1】:

缩进你的代码。

要找到问题所在,使用 -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

【讨论】:

  • 我刚开始编程,我从你们的 cmets 看到我的程序是一个网格。非常感谢,有些部分没有意义。
  • 没关系,很正常 :) 祝你好运,学习 C 是一种有益的经历。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多