乙個關於函式內部指標引數返回的錯誤除錯及分析

2021-04-27 14:31:57 字數 1769 閱讀 4673

乙個關於函式內部指標引數返回的錯誤除錯及分析 在

c語言中如下兩個概念是非常重要,但又是極其容易在程式設計中出問題的:1.c

語言中指標儲存的是乙個位址,而非實際的資料項內容。2.c

語言中函式內部定義的變數的作用域或生存空間只在函式內。

下面就本人在程式設計中出現的乙個錯誤**進行分析,(這個**出的問題就是以上

2點。)除此之外提出乙個

gcc導致該程式費了很大功夫才找到這

2個錯誤的

bug。01.

#include 02

.#include 03

.struct test; 07

.struct test2; 11

.void fun(struct test2 *st) 12

. 19.

20.void print(struct test2 *st) 21

. 24.

25.int main() 26

. 該**的錯誤在於,

16行處,將

fun函式內的區域性變數

fst的位址交給了指標引數

st->w

,從而主函式中列印輸出的時候

st->w

指標所指的內容由於

fun函式的返回而被系統**了。

現在看來原理非常簡單。但除錯該段**卻花費了本人很多時間。執行上面的程式我們得到如下的結果:01.

fun:1 2 02

.main:1 2 03

.print:2013480168 -1

在結果第

1行返回正確的值

1 2,並且在第

2行,仍然返回的是

1 2。這就讓人搞不清楚了,由現在的輸出怎麼也不會讓人聯想到在

fun函式裡面就出了問題,因為在31行

main

函式中輸出了正確的結果

1 2,從而檢查的焦點不自覺的就轉移到

32行呼叫的

print

函式。但該函式本來就沒有任何錯誤,自然就陷入了麻煩之中了。

我們再看下面這個程式:01.

#include 02

.#include 03

.struct test 04

.; 08

.09.void fun(struct test *st) 10

. 17.

int main() 18

. 同樣的再14行

fun函式中錯誤的將區域性變數

fst的位址給了引數指標,而主函式中該位址被系統**,得到如下的結果:01.

fun:1 2 02

.main:0 0

這個就比較明顯的看出效果來,在

fun函式返回後,

main

函式中輸出的結果已經被清零了,說明

fun函式部分有問題。

我們再回過頭看看第乙個**,為什麼會出現前面的狀況,

2個**不同之處在於,第乙個**中結構體的成員本身也是指標,我們是對這個成員指標進行的操作,在

fun返回後系統並沒有對該成員引用的位址進行銷毀(應該算是

gcc的乙個

bug),所以在

31行的

main

函式中返回的仍然是

1 2,而

32行呼叫

print

函式時,系統將儲存當前的斷點位址等資訊,該資訊恰好寫入了原來

fun函式分配的區域性變數

fst的位址,從而改變了原有的資料內容

1 2,所以輸出結果的第

3行,得到了乙個錯誤的結果。

返回乙個參考的內部

我們把值時 smyarray,10 value 返回乙個參考的內部smyarray陣列第十元素。main 然後使用這些參考指定元素的值5。雖然這是有點做作的例子 因為你可以直接訪問smyarray.anvalue 一旦你了解課程你將發現更多的用途,通過引用返回值。返回位址 返回的返回位址到位址的變數...

乙個函式如何返回多個引數

乙個函式返回多個引數的方法主要有以下幾種 1.用指標 2.用引用 3.用結構體 4.用stl中的pair 請參考這篇部落格 下面針對 對這四種方法進行說明 include include using namespace std typedef struct aaa aaa void fun int ...

C 做乙個返回陣列指標的函式

這個問題我已經不是第一次遇到了,由於不是總程式設計,所以總會忘記這一點 在c 中是不允許陣列作為函式的返回值的 所以想要函式返回乙個陣列,那麼只能返回這個陣列的指標,然後在想呼叫這個陣列的函式中新建指標然後呼叫這個函式。舉個例子 生成含有範圍屬於 begin,end 的188個隨機整數的陣列 int...