这是我发布的第一个问题,我确保检查其他主题有类似主题和相同问题的帖子,但是迄今为止没有一个解决方案帮助过我。
问题:通过下面的makefile进行编译时
OBJ = hw1.o
hw1: $(OBJ)
g++ -g -o hw1 $(OBJ)
hw1.o:
./PHONE:
clean
clean:
rm hw1.o
每3次运行我收到一个分段错误。我在这个网站上看到的解决方案包括在主程序之外移动linked_list*
个对象,但是当我尝试这个时,它每次运行都会给我分段错误。
以下是我的代码:
#include<iostream>
#include<iomanip>
#include<fstream>
#include<vector>
struct linked_list
{
int data;
void set_data(int d) { data = d; }
int get_data(void) {return this->data; }
void set_next(linked_list* ll) { this->next = ll; }
linked_list* get_next(void) { return this->next; }
linked_list* next;
};
//linked_list* head; this is where I moved the objects out of main
//linked_list* tail; which cause seg faults every run
//linked_list* temp;
void print_linked_list(linked_list*, int);
int main()
{
linked_list* head;
linked_list* tail;
linked_list* temp;
std::ifstream data1, data2;
int element = 0; //elements from list
int size_ll = 0;
//Open data1.txt and check for errors
//data1.txt contains elements to be added in to both data structures
data1.open("data1.txt");
if(data1.fail())
{
std::cout << "Error: Couldn't open data1.txt\nCheck that file exists...\n";
return 0;
}
//Open data2.txt and check for errors
//data2.txt contains elements which need to be deleted in both data structures
data2.open("data2.txt");
if(data2.fail())
{
std::cout << "Error Couldn't open data2.txt\nCheck that file exists...\n";
return 0;
}
head->set_next(NULL);
tail->set_next(NULL);
for(int i = 0; i <= 150; i ++)
{
data1 >> element;
temp = new linked_list;
temp->set_data(element);
temp->set_next(NULL);
if((size_ll % 50) == 0 && size_ll != 0)
{
std::cout << "\n\nPrinting current linked list (left to right, top to bottom):";
std::cout << "\nCurrent size: " << size_ll;
std::cout << "\n\n";
print_linked_list(head, 0);
std::cout << "\n";
std::cout << "End of current list.\n";
}
//handling linked list
if(size_ll == 0)
{
head = tail = temp;
size_ll++;
}
else
{
tail->set_next(temp);
tail = temp;
size_ll++;
}
}
data1.close();
data2.close();
}
//pass the next element of the linked list
void print_linked_list(linked_list* current, int lol)
{
if(current == NULL)
{
return;
}
std::cout << std::setw(4) << current->get_data() << " ";
if(lol == 9)
{
std::cout << std::endl;
lol = -1;
}
print_linked_list(current->get_next(), lol+1);
}
答案 0 :(得分:1)
看看你写的是什么:
linked_list* head;
linked_list* tail;
然后你做:
head->set_next(NULL);
tail->set_next(NULL);
未初始化head
或tail
。这是一个UB
答案 1 :(得分:1)
您没有初始化链接列表。如果你将它们作为静态变量,它们将被初始化为零,并且行head->set_next(NULL)
将在尝试取消引用NULL时崩溃。
在main()
中定义它们时,它们具有随机堆栈值。如果堆栈值是无效地址,您将在同一行崩溃,但如果它恰好包含指向有效内存的地址,您只需开始覆盖任意内存。