任何人都可以帮助我不断得到这个分段错误。这段代码很简单,但错误很难弄明白。
struct Link {
int key;
unsigned data: 2;
struct Link *next;
struct Link *previous;
};
struct Link* addInOrder(struct Link *, struct Link);
int main() {
struct Link *head;
struct Link data1;
struct Link data2;
struct Link data3;
data1.key = 25;
data1.data = 1;
data1.next = NULL;
data2.key = 50;
data2.data = 0;
data2.next = NULL;
data3.key = 100;
data3.data = 2;
data3.next = NULL;
head = NULL;
head = addInOrder(head, data2);
}
struct Link* addInOrder(struct Link *srt, struct Link l) {
if(!srt) {
return &l;
}
struct Link *temp = srt;
while(temp->next && l.key > temp->key)
temp = temp->next;
printf("here\n");
if(l.key > temp->key) {
printf(" 1\n");
temp->next = &l;
l.previous = temp;
}
else {
printf(" 2\n");
l.previous = temp->previous;
l.next = temp;
printf( "2.2\n");
if(temp->previous) {
//printf("%i\n",temp->previous->key);
temp->previous->next = &l;
}
printf(" 2.3\n");
temp->previous = &l;
}
return srt;
}
我一直在addInOrder()的第一行收到错误。所有编译器都说是分段错误。
编辑:另外,如果我在if语句后添加 printf(“...”); 并运行它...不打印
答案 0 :(得分:3)
您通过值(addInOrder()
)传递struct Link l
的第二个参数。这会在您调用函数时创建参数的副本,并且在addInOrder()
中,l
存在于堆栈中。然后,您将返回局部变量的地址并将其分配给head
,但是当函数退出时,该变量超出范围并被取消分配。因此,您要为head
分配无效地址,这会导致段错误。
答案 1 :(得分:2)
部分(以及使用的所有地方&l
)
if (!srt)
return &l;
返回堆栈变量的地址。
您的addInOrder
函数可能应该有签名
struct Link* addInOrder(struct Link* srt, struct Link* l);