我正试图创建一个简单的程序来向链表添加值。代码编译时没有错误。我在尝试执行文件时遇到分段错误。我尝试使用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
标志进行编译,并经常运行代码(每隔几行(。这应该有助于避免这里的许多问题。使用valgrind
、asan
或gdb
来检测和诊断类似于此程序中的内存问题。
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;
}