繁体   English   中英

如果参数是指针类型,则参数是在本地存储器中分配的指针

[英]If a parameter is a pointer type, is the parameter a pointer allocated in local memory

我只是学习C,我对指针参数有疑问。 我的代码如下:

int Length(node *head)
{
  int length = 0;

  while (head) {
    length++;
    head = head->next;
  }

  return length;
}

我正在阅读的书中的代码说要做到这一点:

int Length(struct node* head)
{
    struct node* current = head;
    int count = 0;

    while (current != NULL) {
        count++;
        current = current->next;
    }

    return count;
}

真的有区别吗? 我正在阅读我的代码的方式是我得到一个指向node结构的指针作为参数。 然而,指针本身是一个局部变量,只要我不首先取消引用它,我就可以自由变异。 因此,我可以将指针的值更改为指向不同的node (可能是下一个节点)。

这会导致内存泄漏还是还有其他一些我没看到的差异?

此代码用于链接列表实现。 节点结构定义为:

// Define our linked list node type
typedef struct node {
  int data;
  struct node *next;
} node;

是的,他们都在做同样的事情。 但在第二个例子中,由于代码,作者试图做的更清楚。 在第一个示例中,您使用指针头来引用除头部之外的节点。 这可能令人困惑。

你可以像这样编写你的函数,你的意图是明确的:

int GetLength(node* current)
{
  int length = 0;

  while (current != NULL)
  {
    length += 1;
    current = current->next;
  }

  return length;
}

您的解决方案和推理是正确的。 node参数是一个局部变量:传递给函数的指针的副本,在堆栈上分配。 这就是你可以在函数中修改它的原因。

两种解决方案之间没有区别,至少在功能上没有区别,现代编译器最有可能优化本书解决方案中的额外变量。 唯一的细微差别在于风格,许多人倾向于将参数作为不可修改的值,以防万一,以避免错误。

您对论证传递机制的理解是正确的。 有些人只是不喜欢修改参数值,原因是修改参数往往容易出错。 人们强烈期望在函数的任何一点,如果你想获得调用者作为head传递的值,你就可以写出head 如果修改参数,然后不注意,或者如果你沮丧个月后维护的代码,你可以写head期待的原始值,并得到一些其他的事情。 无论参数的类型如何,都是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM