【发布时间】:2020-12-03 22:51:06
【问题描述】:
当我在链表中有超过 2 个结构时,编译器会给我分段错误。
我有一个结构体Car,其中包含有关汽车的信息
struct Car {
string name;
string color;
int serialNumber;
int regestrationNumber;
int yearMade;
int yearInspection;
int price;
};
我有一个链表
struct Node {
Car obj;
struct Node* next;
};
我这样声明:
struct Node* head = NULL;
我用这个代码块收集信息
cout << "name: " ;
getline(cin, newCar[size].name);
cout << "color: ";
getline(cin, newCar[size].color);
cout << "serial number: ";
cin >> newCar[size].serialNumber;
cout << "regestration number: ";
cin >> newCar[size].regestrationNumber;
cout << "year made: ";
cin >> newCar[size].yearMade;
cout << "inspection year: ";
cin >> newCar[size].yearInspection;
cout << "price: ";
cin >> newCar[size].price;
cin.get();
我将所有这些信息添加到结构并使用此函数将该结构推送到链表
void push(struct Node** head, Car node_obj)
{
Node* newNode = newNode;
newNode->obj = node_obj;
newNode->next = (*head);
(*head) = newNode;
}
现在是有趣的部分:
我使用函数void output(Car strk, int first)来打印这样的结构内容(output()基本上是三个printf()函数)
while (headCopy != NULL) {
output(headCopy->obj, first);
headCopy = headCopy->next;
first = 1;
}
现在,当链表中包含超过 2 个元素时,它会显示除第一个元素之外的所有元素,其中显示 segmentation fault。
我认为问题是到最后headCopy = headCopy->next; 根本没有指向任何东西,但话说回来,当它有 1 或 2 个元素时为什么不给我那个错误。
【问题讨论】:
-
Node* newNode = newNode;是错误的。你的意思是Node* newNode = new Node;? -
Hack 技巧:
push可以通过引用来消除引用并利用 Aggregate Initialization 并减少到void push(struct Node*& head, Car node_obj) { head = new Node {node_obj, head}; } -
@user4581301 - 这很聪明 - 最短的 forward-chaining 加上
:) -
聪明,但不够聪明,无法避免连续两个“和”的歧义。该死的英语。
-
@MikeVine 是的,你完全正确,谢谢
标签: c++ arrays struct linked-list