簡體   English   中英

在 function 中將結構作為參數傳遞

[英]Passing structure as an argument in function

我有一個關於在 function 中傳遞 arguments 的問題。就像我發現我可以通過兩種方式傳遞結構的 arguments 一樣:

第一

name_t* foo(name_t* foo)
{
    //do some changes with structure
    return foo->something
}

第二

name_t foo(name_t foo)
{
    //do some changes with structure
    return foo.something
}

這些方法有什么區別?

memory是怎么寫的?

當我在同一個function中使用一種方法和第二種方法時是否有水下岩石? 例如,當兩個 arguments 通過相同的 function 時,第一個等於第二個,反之亦然。

像那樣:

name_t* foo(name_t* foo, name_t foo2)
{
    //do some changes with structures
    foo->something = foo2.something;
    return foo;
}

謝謝。

一個版本傳遞一個指向調用者結構的指針。 通過指針所做的任何更改都會影響調用者的結構。

第二個版本傳遞調用者結構的副本,因為 C 是一種按值調用的語言。 任何更改只會影響本地副本,不會影響調用者的結構。 但是,它是一個淺拷貝; 如果結構包含指向其他結構的指針,則不會遞歸復制它們,並且對那些引用結構的更改將影響原始結構。

最后一個例子應該沒問題。 foo2是調用者結構的副本,您可以對其進行更改而不影響調用者。 然后你可以在通過foo指針賦值的時候修改調用者的結構體。 沒有別名問題,因為一個是副本。

除了上面評論中提出的不同要點(參數名稱隱藏 function 名稱,第一和第二個剪輯中的 function 簽名不一致)。

我想建議您在決定如何創建和傳遞結構實例時應該考慮結構的物理大小:

typedef struct name_t {
  char title[256];
  int something;
} name_t;

int my_function(name_t n) {
    // this function cannot change the sender's copy of n
    return strlen(n.title);
}

int my-by_ref(name_t * n) {
    // this function has the ability to change n and reflect changes back
    // do work
    return ...
}

在將int表示為 4 個字節的系統上,此結構的每個實例將占用 260 個字節。

name_t person = {"John Doe", 1}; // 260 bytes on stack
int len_title = my_function(person); // pushes another 260 bytes onto the stack
int result = my_by_ref(&person); // pushes the number of bytes a pointer takes 
...

這是一個人為的例子,但通過引用發送將需要 CPU 復制人的地址(通常為 8 個字節,但取決於您的操作系統),而不是 260 個字節。 如果需要經常處理此結構,則可以加起來。

有許多更有效的方法來實現這樣的任務,每個方法都有一定的責任,例如確保在 function 完成后,您不會返回指向 scope 中的 go 的數據指針,這些數據在您問題的 scope 之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM