c 函式返回結構體陣列的神奇之處

2021-10-04 06:43:58 字數 958 閱讀 8190

眾所周知,如果我們想用函式返回乙個陣列,那麼我們應該用new來分配記憶體,而不是單純地申明陣列區域性變數,否則函式體結束後區域性變數被釋放,陣列也就丟失了:

//申明區域性變數

int*

test0()

;return a;

}//用new分配記憶體

int*

test1()

;return a;

}//列印兩種申明方式地結果

intmain()

結果如下

嗯,和我們的預期一致。

然而,當我們的陣列是結構體型陣列而非整型陣列時,神奇的事情發生了:

struct point

;point*

test()

,};return p;

}point*

test2()

; p[1]

=;return p;

}int

main()

你以為這樣得到的p0、p1是空值嗎?不!!它還真傳遞過來了!

更神奇的是,當程式執行到return 0,也就是執行完cout這行之後,p指向的空間被釋放了!!!

驚喜嗎?意外嗎?沒錯這就是你嘗試用不該用的方式返回結構體陣列的代價,它會讓你以為它可行,讓你以為記憶體都還在,當你暗自竊喜準備拿著返回的陣列用的時候再給你偷偷釋放掉,沒錯這個bug我找了一晚上。

老老實實new它不香嗎

關於返回結構體的函式

本文的範例 取材於 彙編中函式返回結構體的方法 一文,並在此基礎上進行修改和試驗。要研究的第乙份 如下,定義乙個不超過 8 bytes 的小結構體,不超過 8 bytes 是因為這個結構體能夠用 edx eax 容納,我們之後將看到在 release 編譯時,編譯器能夠向返回普通基礎型別那樣進行返回...

C 語言函式返回結構體彙編分析

為檢驗vc預設設定下結構的對齊情況,特定義結構如下 1 typedef struct ctest 2 ctest,pctest 9 getdata 函式返回上面定義的結構,由此可觀察 c 語言中返回結構時的細節 10 ctest getdata 11 0040104a 8be5 mov esp,eb...

c 函式返回陣列

c 語言 不允許返回乙個完整的陣列作為函式的引數 但是,您 可以通過指定不帶索引的陣列名來返回乙個指向陣列的指標 我們將在下一章中講解有關指標的知識,您可以先跳過本章,等了解了 c 指標的概念之後,再來學習本章的內容。如果您想要從函式返回乙個一維陣列,您必須宣告乙個返回指標的函式,如下 int my...