簡體   English   中英

有沒有辦法可以將結構變量作為參數傳遞給 function? (C)

[英]Is there a way I can pass a struct variable as an argument to a function? (C)

編輯:(1)標題(-以前的標題:如何將指針的地址分配給已經存在的變量?-在消息底部解析); (2) “簡而言之”; (3) 拼寫/標點符號。

簡而言之:我正在嘗試創建然后在堆上定位一個結構(我想將 memory 保存在堆棧上),並將 arguments 傳遞給各種函數以填充該結構。 在以前的項目中,我創建了一個指向 struct 的指針,使用 malloc 在堆上分配它,最后將指針作為參數傳遞給函數 - 這非常有效。 我的問題:在不使用指針的情況下可以做同樣的事情嗎?

我正在嘗試將結構存儲在動態 memory 中。 我在之前的一個小型項目中取得了成功,但我使用了指向結構的指針,並將這個指針傳遞給我的所有函數。 現在我很想知道我是否可以簡單地省略傳遞指針並將變量結構本身傳遞到 function 中。

我目前的例子

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct s_text t_text;

typedef struct s_text
{
    int     letters;
// some more stuff
} t_text;


int main(void)
{
    t_text text;
    t_text *tp;

    tp = malloc(sizeof(t_text));
    //&text = tp; <-- this here I tried, but error (value required as left operand of assignment)
    return (0);
}

在上面的代碼中,我在堆上為 tp 分配了 memory。 這是我想使用的 memory。 現在,在堆棧上,memory 被保留用於(t_text)文本。 我想丟棄它,只使用堆。

t_text &text = malloc(sizeof(t_text)); <-- 這可能適用於 C++,我不知道,但在 C 中絕對不行。

在另一篇關於 NULL 指針的討論中,有人在 C++ 中聲稱,變量的地址可以指向 NULL,代碼如下: int &x = *(int*)0; 但這絕對不被我的編譯器所欣賞。 事實上,我用變量的地址嘗試了幾件事,但每次我嘗試設置 eg &text = (some address)時都會彈出這個錯誤:
錯誤:需要左值作為賦值的左操作數。

(鏈接到我提到的帖子:ttps://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable/57492#57492)

下面是我之前嘗試過的(並且效果很好):

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct s_text t_text;

void    fn_prompt_user(t_text *tp);
void    fn_calc_letters(t_text *tp);

typedef struct s_text
{
    int     letters;
// some more stuff
} t_text;


int main(void)
{
    t_text *tp;

    tp = malloc(sizeof(t_text));
    fn_prompt_user(tp);
    fn_calc_letters(tp);
    return (0);
}

用我的問題結束這篇文章:有沒有一種方法可以將結構變量作為參數傳遞給 function,或者我應該接受傳遞指向結構的指針是 go 的唯一方法?

謝謝!

-- 回答上一個標題的問題(如何將指針的地址分配給已經存在的變量?):不可能。 錯誤:錯誤:需要左值作為賦值的左操作數。 聲明變量時,放在memory中。 這個 memory 位置不能改變,所以如果int a = 3; a 是一個左值(位置值),可以更改(例如 4),但 &a 是不可更改的,因此是一個右值(3 也是如此)。 所以&a = ptr_a; 永遠不會工作。 感謝您的澄清。

您可以將結構傳遞給 function,例如....

int myfunc(t_text mytext) {....}
then ...
t_text thistext;
...
myfunc(thistext);

這會將整個結構放入堆棧以供子例程使用。 但是 C 語言沒有像 C++ 這樣的“參考”功能。

你可以...

tp = (t_text *)malloc(sizeof(t_text));
myfunc(*tp);

==

您的第二個示例,傳遞指向對象的指針,是在 C 中使用結構的非常傳統的方法。 它的優點是不需要將結構復制到堆棧中,而只是將指針復制到堆棧中。 它的缺點是允許函數修改指向的對象。 后一個問題可以通過聲明參數指向一個 const 結構來解決。 喜歡:

無效 fn_promt_user(const t_text *tp) {...}

我應該接受傳遞指向結構的指針是 go 的唯一方法嗎?

基本上,是的。

C 沒有內置在語言中的“通過引用”。 如果您想讓 function 為您填充或以其他方式修改結構(或任何其他 object),傳遞指針是正常且慣用的方式。 除了丑陋的宏黑客和類似的東西之外,沒有真正的選擇。

暫無
暫無

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

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