访问链表时的分段错误11

时间:2014-02-11 19:46:05

标签: c++ linked-list segmentation-fault

我确定我搞砸了我的指针,或者可能是最初的NULL,但我无法弄明白。

我正在尝试将链接列表写入文本文件:

write_out(node *ll){
    ofstream out;
    out.open("output.txt");
    if (!out.is_open()) exit(EXIT_FAILURE);

    cout << ll->value;

    //stuff to write out
}

struct node {
    int value;
    node *next;
}

但是cout << ll->value行会导致Segmentation fault: 11,但我不明白为什么。

我已经注释掉了我实际写出的代码,因为这是无关紧要的,问题显然是我(缺乏)了解上述工作原理。

我致电write_out(linkedlist),其中node* linkedlist指向第一个节点。

这发生在:

之后
read_in(node *ll){
    ifstream data; //opened and checked open as above for out
    int v;
    ll = new node;
    node *tmp = ll;
    data >> tmp->value;
    while(data >> v){
        tmp->next = new node;
        tmp = tmp->next;
        tmp->value = v;
    }
    tmp->next = NULL;  //thanks @sharth
}

肯定没有离开ll = NULL

3 个答案:

答案 0 :(得分:2)

read_in(node *ll){

ll是按值传递的参数。这意味着read_in内的任何更改都只是本地的,并且在它之外没有任何影响。因此,在read_in完成后,指向列表头部的指针仍为NULL(假设您使用了初始化指针)。因此,使用write_out参数调用NULL会取消引用NULL指针,这将导致您的SIGSEGV。

答案 1 :(得分:0)

我可以猜测问题出在你将新节点添加到列表的功能中。

我认为你做了类似的事情

void add_node( node *n, int value );

node *linkedlist = NULL;

add_node( linkedlist, somevalue );

在这种情况下,函数内链表的任何更改都不会影响原始对象链表。所以它仍然等于NULL。因此,当您尝试输出列表并使用

cout << ll->value;

ll等于NULL。

答案 2 :(得分:0)

只是一个简单的例子来补充@Michael Foukarakis所指出的

#include<iostream>

void this_dont_change_ptr(int* a, int val){
    a = new int;
    *a = val;   
}

void this_changes_ptr_itself(int** a, int val){
    *a = new int;
    *(*a) = val; 
}

int main(){

    int *my_ptr = NULL;
    this_dont_change_ptr(my_ptr, 5);

    if(my_ptr == NULL){
        std::cout << "In fact, ptr is still NULL" << std::endl;
    }

    // What I do with allocated memo??

    // grants that my_ptr is NULL again
    my_ptr = NULL;  
    this_changes_ptr_itself(&my_ptr, 5);
    if(my_ptr == NULL){
        std::cout << "MUST never get here!" << std::endl;
    }
    else{
        std::cout << "Now we have a new value " << *my_ptr << std::endl;    
    }

    delete my_ptr;  

    return 0;
}