我仍然对链表和结构之间的关系感到麻烦。
请参阅,我的目标是创建一个列表,其中每个节点包含2个字符的字符串。所以,我试过这样的事情:首先,我创建一个用我的2个字符表示元素的结构;第二,我的列表的控制结构,它将指向我的列表的开头。在我的.h中,它给出了这样的东西:
typedef struct s_def { char *first_word; char *second_word; struct s-def *next; } t_def
typedef struct s_type { t_def *first; } t_list;
接下来,我尝试初始化我的列表。我创建了一个像这样工作的函数:
t_list *list;
t_def *words;
list = malloc(sizeof(*list));
words = malloc(sizeof(*words));
if (list == 0 || words == 0)
return (NULL);
words = NULL;
words->next = NULL;
list->first = words;
return (list);
精确度:我现在尝试创建一个空列表,以便用户稍后可以添加一些元素。
这就是它阻止的地方:当我运行程序时,它会给出典型的分段错误。但它看不出我做的是什么问题!我在我的函数中写了一些函数来回溯过程:malloc工作正常,以及单词= NULL,但是段错误似乎在行中运行
words->next = NULL;
我做错了什么?为什么我不能在下一个单词中给出NULL值?
答案 0 :(得分:5)
首先使用分配的内存初始化word
指针
words = malloc(sizeof(*words));
然后3行向下将该指针再次设置为NULL,从而产生内存泄漏
words = NULL;
然后您尝试取消引用刚刚设置为NULL的指针:
words->next = NULL;
所以,只需删除words = NULL;
答案 1 :(得分:5)
问题很可能是这部分:
words = NULL;
words->next = NULL;
在这里将指针words
重新分配为空指针,然后直接取消引用此空指针,从而导致未定义的行为。
答案 2 :(得分:1)
当您将单词设置为NULL时,您已经创建了一个空指针。之后通过words-> next尝试立即访问它有效地执行NULL-> next会导致错误。 对于简单的链表实现,您的代码看起来要复杂得多,您可以尝试类似:
typedef struct s_element
{
char* firstWord;
char* secondWord;
s_element* next;
} t_element;
t_element* list = NULL;
t_element* addFront(t_element* list, char* word1, char* word2)
{
t_element* next = list;
list = malloc(sizeof(t_element));
if (!list) return NULL;
list->firstWord = word1;
list->secondWord = word2;
list->next = next;
return list;
}
假设我没有犯任何骨头语法错误,这应该像链表一样清晰。请注意,它不需要检查列表是否为空,唯一的条件是malloc失败。