gpt4 book ai didi

c - C 编程中的链表

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:14 25 4
gpt4 key购买 nike

我目前正在学习 C,我的实践之一是在 C 中创建链表。

typedef struct deck
{
int index;
struct deck *next;
} decks;

我的问题是为什么我不能创建一个新的链表如下:(索引,“=”之后的卡片被定义为变量)

decks* head = malloc(sizeof(decks));
decks* ptr = head;
for(int i = 0; i < 10; i++) {
ptr -> index = i;
ptr = ptr -> next;
ptr = malloc(sizeof(decks));
}

非常感谢!

最佳答案

关于调试指针的提示

画画。为每个实例创建一个框,并从每个非空指针创建一个箭头。始终遵守下列规则。假设所有内存管理都是使用 mallocfree 完成的,这些规则没有异常(exception)。

  1. 每次且仅当您执行 malloc 时,您应该绘制一个新框。
  2. 每次且仅当您使用free 时,您应该删除(或只是用 X 或其他东西交叉)一个框。
  3. 每次使用 free 时, 那个盒子里的箭头都去掉。
  4. 每次将指针分配给一个值(空值或非空值)时,如果旧箭头存在,则将其移除。
  5. 每次且仅当您将指针分配给非空值时,绘制一个箭头。

注意:对于 malloc 的典型调用,您将同时使用规则 1、4 和 5。使用 malloc 而不考虑返回指针意味着内存泄漏。

注意 2:重要!当您使用 free 时,您不应该删除指向您正在解除分配的框的箭头。仅当您专门将指针分配给 null 时才这样做。同样,当您将指针分配给 null 时,请勿删除框。

注意 3:重要!如果您释放了一个盒子,规则 3 规定您应该移除该盒子中的所有箭头。不要删除箭头指向的任何框。

你的问题

考虑一下:

ptr = ptr -> next;
ptr = malloc(sizeof(decks));

第一行没有任何效果,因为您立即重新分配了 ptr。你需要这样的东西:

ptr -> next = malloc(sizeof(decks));
ptr = ptr -> next;

其他备注

我建议对变量而不是类型使用 sizeof,如下所示:ptr->next = malloc(sizeof *(ptr->next)) 这通常是一个好习惯。拿这段代码:

int *x;
x = malloc(sizeof(int));

现在考虑是否要更改变量x 的类型。您需要在每次调用 malloc 时将参数更改为 sizeof。使用 x = malloc(sizeof *x) 完全消除了这个问题。

关于c - C 编程中的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55112514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com