第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

從C中的函數(shù)返回`struct`

從C中的函數(shù)返回`struct`

C
德瑪西亞99 2019-10-14 15:31:50
今天,我在教學(xué)上幾個(gè)朋友如何用C struct秒。其中一個(gè)詢問您是否可以struct從函數(shù)中返回a ,我回答:“不!您將返回指向動(dòng)態(tài)malloced struct的指針?!眮碜灾饕獜氖翪 ++工作的人,我期望無法struct通過值返回s。在C ++中,您可以operator =為您的對象重載,并且完全有意義的是有一個(gè)函數(shù)可以按值返回您的對象。但是,在C語言中,您沒有該選項(xiàng),因此讓我開始思考編譯器的實(shí)際作用??紤]以下:struct MyObj{    double x, y;};struct MyObj foo(){    struct MyObj a;    a.x = 10;    a.y = 10;    return a;}        int main () {    struct MyObj a;    a = foo();    // This DOES work    struct b = a; // This does not work    return 0;}    我知道為什么struct b = a;不起作用-您不能operator =為您的數(shù)據(jù)類型超載。a = foo();編譯效果如何?它不是什么意思struct b = a;嗎?可能要問的問題是:return與=簽字共同聲明的語句到底做了什么?[edit]:好的,我只是指出這struct b = a是一個(gè)語法錯(cuò)誤-沒錯(cuò),我是個(gè)白癡!但這使事情變得更加復(fù)雜!使用struct MyObj b = a確實(shí)有效!我在這里想念什么?
查看完整描述

3 回答

?
Helenr

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;

}


查看完整回答
反對 回復(fù) 2019-10-14
?
慕勒3428872

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)足夠小,它甚至可能會完全傳回寄存器中。


查看完整回答
反對 回復(fù) 2019-10-14
  • 3 回答
  • 0 關(guān)注
  • 757 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號