我正在try 运行一个单链表的程序. 在删除前面的函数中,每当我调用函数时,执行都会在释放函数处停止.

void del_front()
{
    struct node *new;
    new = (struct node *)malloc(sizeof(struct node *));
    if (head == NULL)
    {
        printf("list is empty\n");
        return;
    }
    else
    {
        new = head;
        head = new->next;
        free(new);
        printf("Node at beginning deleted\n");
    }
}

这是删除链表前端 node 的代码. 我在代码中遗漏了什么吗?

推荐答案

我是不是在代码中漏掉了什么?

是的,您分配的是指针的大小,而不是 struct 的大小.您应该使用以下任一选项:

  • struct node *new = malloc(sizeof(struct node));

  • struct node *new = malloc(sizeof(*new));

在程序的其余部分中,您可能会遇到类似的分配问题,导致当您更改 node struct 超过分配的大小时,代码具有未定义的行为.

del_front的情况下,不需要分配,如果Head node 存在,只需释放它:

struct node *head;

// [...]

void del_front(void) {
    if (head == NULL) {
        printf("list is empty\n");
    } else {
        struct node *tmp = head;
        head = head->next;
        free(tmp);
        printf("Node at beginning deleted\n");
    }
}

C++相关问答推荐

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

使用NameSurname扫描到两个单独的字符串

在编译时参数化类型定义

模拟shell并运行.sh文件

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

函数的限制限定指针参数允许优化调用方函数吗?

如何使用_newindex数组我总是得到错误的参数

为什么数组的最后一个元素丢失了?

可变宏不能编译

-Wnonnull-Compare警告不是具有误导性吗?

为什么电路板被循环删除?

某些EAX值的不同调用方的CPUID结果不一致

无算术运算符和循环的二进制乘法

C中的空指针是什么(_N)?

UpDown控制与预期相反

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

如何在Rust中处理C的longjmp情况?

程序打印一些随机空行

Clang 是否为内联汇编生成了错误的代码?

如何在Linux上从控制台左上角开始打印文本?