我确定我搞砸了我的指针,或者可能是最初的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
?
答案 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;
}