【问题标题】:How can I use head in place of struct node?如何使用 head 代替结构节点?
【发布时间】:2018-07-08 18:42:49
【问题描述】:

我做了一个函数来在一个以整数作为参数的链表中创建一个节点。当我使用这个功能时,我的程序运行良好,但我怀疑这里使用malloc

我尝试过的:

我的结构是:

struct{
    int data;
    struct node*
}

这是我的插入函数:

void insert(int x){
    struct node *temp=(struct node*)malloc(sizeof(struct node));
    temp->data=x; 
    temp->next=head;
    head=temp;
}

请注意,我将 head 声明为全局变量:

struct node* head;

显然 head 是一个指针变量(指向结构节点的指针),它只占用内存中的 4 个字节,而(结构节点)将占用内存中的 8 个字节。 我的疑问是:当我在 sizeof 运算符中使用 head 而不是 struct node 时,即

struct node *temp=(struct node*)malloc(sizeof(head));

我没有收到错误,没有警告,并且得到了与以前完全相同的答案,但是对于 head(4 个字节包含整数形式的地址)和 struct node(8字节),那么它不应该影响我的程序吗?

【问题讨论】:

  • 如果您没有为struct node 分配足够的内存,您将调用未定义的行为 - 所以程序中可能会发生任何事情
  • 如所写,您的结构无法编译。请提供minimal, complete, and verifiable example,以及您遇到的问题,以便我们帮助诊断问题所在。
  • 您显示的结构是指您未显示的struct node 类型。这迟早会造成混乱,可能需要不必要的强制转换。
  • 应该是struct node *temp = malloc(sizeof *head);。我认为这是你不应该转换 malloc 的值的一个论点。

标签: c data-structures


【解决方案1】:

是的,你可以,但你会遇到问题。由于 C 不会为您进行任何边界检查,因此您只会产生它正常工作的错觉。您很幸运,没有其他人正在使用您在 *next 指针中访问的内存。因此,如果您在几分钟/小时后在另一台机器或同一台机器上尝试此代码,它可能无法正常工作。您实际上是在通过写入一块您尚未 malloc'ed 的内存来破坏这里的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 2020-07-17
    • 2010-12-12
    • 2011-10-03
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多