我只需要另外一双眼睛来帮助我指出我确实犯过的一个愚蠢的错误。
结构和原型:
typedef struct node {
int data;
struct node *next;
} Node;
Node *orderedInsert(Node *p, int newval);
/* Allocates a new Node with data value newval
and inserts into the ordered list with
first node pointer p in such a way that the
data values in the modified list are in
nondecreasing order as the list is traversed.
*/
功能:
#include "orderedList.h"
#include <stdio.h>
#include <stdlib.h>
Node *orderedInsert(Node *p, int newval){
struct node* new = NULL
new = malloc(sizeof(struct node));
struct node* last = p;
while(1){
if (p == NULL){
if (last == p){
return 1;
}
new->data = newval;
new->next = NULL;
break;
}
if ((last->data <= newval) && (p->data >= newval)){
new->data = newval;
new->next = p;
break;
}
}
return 0;
}
使用任何参数调用orderedInsert时出现分段错误。
答案 0 :(得分:3)
我不认为函数本身就是segfaulting,它可能在你没有向我们展示的调用代码中。虽然这里有一些明显的错误。最明显的是它实际上并没有插入任何东西。此函数创建新节点,但它从不以任何方式更改现有列表,因此该节点是孤立的。其次,它被声明为返回一个指针,但它返回0或1.这不会是段错误,但如果调用者期望一个指针并以这种方式取消引用,那么你将会这样做。
答案 1 :(得分:2)
根据您的反馈,您的问题是,如果调用代码尝试,您将返回Node *
或orderedInsert
,而不是从1
返回0
取消引用会导致seg fault
。正如李指出的那样,还有其他问题,例如你实际上没有正确插入新节点。
答案 2 :(得分:0)
您在声明struct node *
“新”指针时错过了分号。由于返回值,您的方法实现容易出现内存泄漏。
实际上,在谈论这种方法时,很明显它永远不会产生分段错误。大多数情况下,此方法将循环,直到您关闭运行它的进程。
此例程有三个“用例”:
orderedInsert(NULL,/* whatever */)
并在Node *
地址获取0x00000001
; struct node
类型变量分配空间并调用orderedInsert(/* newly allocated variable pointer */,/* value */)
,但要确保新分配的变量的->data
等于value
你进入。对于此实例,您的方法返回空指针。周期; orderedInsert(/* Non-null */,/* not equal to "data" */)
并享受您的代码循环播放。