[英]How to properly encapsulate a linked list struct in another struct in C?
我正在尝试创建一个抽象数据类型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
)。 这些函数接受HiddenHeaders
类型的参数,但在函数体中,这个参数被解包到ListStructure
,然后对该底层链表(或任何其他结构)的内容执行操作
导致此具体分段错误的行是
ListStructure *adt_el = abstract->ptr_to_list;
在Enqueue()
函数的开头—— abstract
等于NULL
,这会导致非法内存访问,从而导致分段错误。
最好在使用指针之前检查指针是否为NULL
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.