c中的链表添加到列表的开头



我正试图创建一个简单的程序来向链表添加值。代码编译时没有错误。我在尝试执行文件时遇到分段错误。我尝试使用printf语句进行调试,但在任何地方都没有得到任何输出。有人能指出我做错了什么吗。

typedef结构在单独的.h文件中,包括也在单独的/h文件中的文件

typedef struct      s_list
{
struct s_list   *next;
void            *data;
}                   t_list;

void    list_push_front(t_list **begin_list, void *data)
{
t_list *l;
l = (t_list*)malloc(sizeof(t_list));
if(l == NULL){
printf("No allocation");
}
printf("%sn", l->data);
l->data = data;
l->next = *begin_list;
*begin_list = l;
printf("%sn", l->data);
}
int     main(void)
{
t_list *k;
k = (t_list*)malloc(sizeof(t_list));
if(k == NULL){
printf("No allocation");
}
printf("allocation");
char s[] = "Woow!";
k->data = "Hello";
k->next->data = NULL;
//  k->next->next->data = NULL;
list_push_front(&k, s);
return(0);
}

printf中调用

l = (t_list*)malloc(sizeof(t_list));
if(l == NULL){
printf("No allocation");
}
printf("%sn", l->data);

您正试图输出指针CCD_ 2所指向的未初始化内存。因此,该函数调用未定义的行为。删除此对printf的调用。这没有道理。

同样在主要的这个声明

k->next->data = NULL;

是不正确的,还会调用未定义的行为。你的意思似乎是

k->next = NULL;

一般来说,始终使用-Wall -Werror标志进行编译,并经常运行代码(每隔几行(。这应该有助于避免这里的许多问题。使用valgrindasangdb来检测和诊断类似于此程序中的内存问题。

  • k->next->data = NULL;是非法的,因为k->next未初始化
  • printf("%sn", l->data);,同样的问题。使用前必须初始化一个值
  • 函数不应产生打印之类的副作用。这对于临时调试来说是可以的,但除此之外,它会导致程序嘈杂和基本上不可用的功能。如果您想要错误,请打印到stderr并退出,或者使用返回值(如枚举或NULL(来指示错误
  • 总是free分配内存
  • 无需对malloc的结果进行强制转换
  • 使用一致的缩进和格式

可能的重写:

#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
struct ListNode *next;
void *data;
} ListNode;
ListNode *list_create(void *data) {
ListNode *node = malloc(sizeof(*node));
if (!node) {
fprintf(stderr, "%s %d: malloc failedn", __FILE__, __LINE__);
exit(1);
}
node->data = data;
node->next = NULL;
return node;
}
void list_push_front(ListNode **head, void *data) {
ListNode *node = list_create(data);
node->next = *head;
*head = node;
}
void list_free(ListNode *head) {
while (head) {
ListNode *dead = head;
head = head->next;
free(dead);
}
}
int main(void) {
ListNode *list = list_create("a");
list_push_front(&list, "b");
list_push_front(&list, "c");
for (ListNode *curr = list; curr; curr = curr->next) {
printf("%sn", (char *)curr->data);
}
list_free(list);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新