簡體   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