我正在尝试创建一个抽象数据类型HiddenHeaders
和相应的函数(IsEmpty
和Enqueue
),其低级结构对于写main()
的用户是透明的。HiddenHeaders *my_list
的初始化实际上创建了链表struct listStructure
,但是用户不应该意识到这一点-他们将仅通过HiddenHeaders
类型的变量与struct listStructure
交互,并且函数或底层链表中的任何改变将不需要main()
中的任何改变。但是我的程序总是在函数被调用的时候出现SIGSEGV,分段错误,为什么呢?
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct listStructure {
int data;
struct listStructure *nextPtr;
};
typedef struct listStructure ListStructure;
struct hiddenHeaders {
ListStructure *ptr_to_list;
};
typedef struct hiddenHeaders HiddenHeaders ;
HiddenHeaders * Enqueue (HiddenHeaders *abstract, int user_input);
bool IsEmpty (HiddenHeaders *abstract);
int main () {
HiddenHeaders *my_list;
int input;
my_list = NULL;
printf ("Enter data item value to add ");
scanf ("%d", &input);
my_list = Enqueue (my_list, input);
return 0;
}
bool IsEmpty(HiddenHeaders *abstract) {
ListStructure *adt_el = abstract->ptr_to_list;
bool isEmpty;
if (adt_el == NULL) {
return isEmpty=true; }
else
return isEmpty=false;
}
HiddenHeaders * Enqueue (HiddenHeaders *abstract, int user_input) {
ListStructure *adt_el = abstract->ptr_to_list;
HiddenHeaders *abstract_Ptr = abstract;
if (!IsEmpty(abstract)) {
while ((adt_el -> nextPtr) == NULL) {
adt_el = adt_el -> nextPtr; }
adt_el -> nextPtr = (ListStructure *) malloc (sizeof (ListStructure));
adt_el = adt_el -> nextPtr;
adt_el -> nextPtr = NULL;
adt_el -> data = user_input;
return abstract_Ptr;
}
else {
adt_el = (ListStructure *) malloc (sizeof (ListStructure));
adt_el -> nextPtr = NULL;
adt_el -> data = user_input;
return abstract;
}
}
我尝试实现这一点的方法是首先创建一个链表结构体,将其定义为一个新类型(ListStructure
),然后创建一个包含指向先前定义的链表的指针的新结构,最后将此新结构定义为类型函数接受HiddenHeaders
类型的参数,但是在函数体中,该自变量被展开为ListStructure
,然后对该底层链表(或其可能是的任何其它结构)的内容执行操作。
1条答案
按热度按时间hiz5n14c1#
导致此具体分段错误的行是
在
Enqueue()
函数的开头--abstract
等于NULL
,这会导致非法内存访问,从而导致分段错误。最好在使用
NULL
之前检查它们的指针。