3 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以從函數(shù)返回結(jié)構(gòu)(或使用=運(yùn)算符),而不會出現(xiàn)任何問題。這是語言中定義明確的部分。唯一的問題struct b = a是您沒有提供完整的類型。 struct MyObj b = a會很好。您也可以將結(jié)構(gòu)傳遞給函數(shù)-為了傳遞參數(shù),返回值和分配,結(jié)構(gòu)與任何內(nèi)置類型完全相同。
這是一個(gè)簡單的演示程序,可完成所有這三個(gè)操作-將結(jié)構(gòu)作為參數(shù)傳遞,從函數(shù)返回結(jié)構(gòu),并在賦值語句中使用結(jié)構(gòu):
#include <stdio.h>
struct a {
int i;
};
struct a f(struct a x)
{
struct a r = x;
return r;
}
int main(void)
{
struct a x = { 12 };
struct a y = f(x);
printf("%d\n", y.i);
return 0;
}
下一個(gè)示例幾乎完全相同,但是使用內(nèi)置int類型進(jìn)行演示。對于參數(shù)傳遞,賦值等的值傳遞,這兩個(gè)程序具有相同的行為:
#include <stdio.h>
int f(int x)
{
int r = x;
return r;
}
int main(void)
{
int x = 12;
int y = f(x);
printf("%d\n", y);
return 0;
}

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
進(jìn)行諸如之類的調(diào)用時(shí)a = foo();,編譯器可能會將結(jié)果結(jié)構(gòu)的地址壓入堆棧,并將其作為“隱藏”指針傳遞給foo()函數(shù)。實(shí)際上,它可能變?yōu)椋?/p>
void foo(MyObj *r) {
struct MyObj a;
// ...
*r = a;
}
foo(&a);
但是,此操作的確切實(shí)現(xiàn)取決于編譯器和/或平臺。正如Carl Norum所指出的,如果結(jié)構(gòu)足夠小,它甚至可能會完全傳回寄存器中。
- 3 回答
- 0 關(guān)注
- 757 瀏覽
添加回答
舉報(bào)