【问题标题】:syntax error of linked lists in dynamic memory in C languageC语言动态内存中链表的语法错误
【发布时间】:2016-07-17 16:06:41
【问题描述】:
void push(struct node* head,int data)
{
    struct node* newnode=(struct node*)malloc(sizeof(struct node)); 
    newnode->data=data;
    newnode->next=head;
    head=newnode; //it doesnt work
}

此代码无效;发生的错误不是语法错误。

【问题讨论】:

  • 那么是语法错误还是不是语法错误?您需要将参数声明为struct node** head,并将最后一条语句更改为*head=newnode
  • head 的更改不会在 push 函数之外可见,我想这正是您想要的。
  • code is not working 意味着很多,请指出你的错误。
  • 代码取自一本书..作者假设此代码不起作用
  • @isedev 为什么它不可见?

标签: c dynamic malloc


【解决方案1】:

C 中的参数是按值传递,而不是按引用传递,也就是说,形参只是实参的副本。或许你能理解为什么下面这个函数不起作用:

void negate(int num)
{
    num = -num; // Doesn't work
}

发布的代码不起作用的原因是相似的。 head = newnode; 只改变形参head 的值。 push() 返回后,调用者的实际参数值保持不变。因此,对于调用者来说,什么也没有发生(期望内存块是malloc()ed 但不是free()ed)。

要改变变量的值,你必须将它们的地址传递给函数:

void push(struct node **head,int data)
{
    struct node* newnode = malloc(sizeof(struct node)); 
    newnode->data = data;
    newnode->next = head;
    *head = newnode;
}

另请参阅:How do I modify a pointer that has been passed into a function in C?

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2021-03-19
    • 2020-02-16
    • 2011-09-13
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多