C語言結構體作為函式引數初始化

2021-10-21 05:53:30 字數 2131 閱讀 9320

首先:一定要謹記c語言中未初始化變數不能拿來使用,不能作為函式引數,是可以以傳位址方式作為函式引數.

前言:一般來講,我們會把初始化結構體的**提取出來,封裝到init()函式中,而通過將結構體變數作為函式引數來完成初始化,但有的時候比如,結構體變數作為引數,在初始化函式中用malloc動態分配記憶體,這樣的行為不能完成外面的變數初始化.這就有可能導致未初始化函式使用的問題.

通過各種實驗發現,首先要將函式中初始化過程分為兩類:1.對結構體成員變數直接賦值2.使用malloc動態分配記憶體後賦值
(1).o為結構體變數,直接賦值
typedef

這裡,可以看到,o為結構體變數,但傳的是位址,通過對位址直接賦值的方法是可以行的通的,而a則是傳值,這,到初始化函式內,其a得到的也只是乙個值.無論怎麼修改,都影響不了外面的a值.

那麼如果o為結構體指標變數呢?

(2).o為結構體指標變數,直接賦值

修改過後,執行結果是o為未初始化變數,不可被使用.那麼也就是說:作為指標變數需要先完成初始化(malloc() or 結構體變數賦值)被使用,而作為普通變數,並不需要先malloc(),然後再賦值.

有關malloc()函式什麼時候用,有什麼利弊,還是需要了解清楚了.

(1) o為結構體變數,分配記憶體後賦值:

#include

//動態分配函式和隨機函式

可以發現,其init()函式後,o並沒有發生變化,這是因為在init()函式內,原本p指標存的是變數o的位址,而通過動態分配記憶體後,p指標又指向了新的(變數)記憶體位址,這時就與o失去了聯絡.

(1) o為結構體指標變數,分配記憶體後賦值:

#include

//動態分配函式和隨機函式

因為未初始化的指標不可直接作為引數使用,所以我們用到了二級指標來接收,指標變數的位址以此完成初始化過程.

從根本上看,指標是乙個值為記憶體位址的變數(或資料物件),所以二級指標還是好理解的.

從結果上看,初始化過程是成功的.

我們用二級指標p去接收變數指標o的位址,然後用*p獲取其值也就是變數指標o,這個時候我們也就直接是對變數指標o動態分配記憶體.也就完成了初始化.

1.c語言中,不管是普通變數,還是指標變數,未初始化時都不能直接拿來使用,但可以通過傳位址的方式使用.

在使用malloc()初始化時,只能使用二級指標傳遞

在不使用malloc()時,其又分為值傳遞和引用即位址傳遞.

2.對未初始化變數函式中初始化有兩種方式:

1.對結構體變數,採取直接賦值方式

2.對結構體指標變數,採取二級指標形參,然後動態分配空間後,賦值

3.malloc()函式的使用情況:

其為動態分配記憶體空間,在分配時需要強轉指定型別,然後返回記憶體首位址,其一般用相關資料型別指標接收.

參考文件:

參考結構體

C語言結構體初始化

1 2 test.c 3 2018 1 30 4 5 include 6 7 struct studen 12 13 14 15 int main void 16 19 20 number two 先定義再乙個個初始化 21 struct studen std2 22 std2.id 120 23 ...

C語言結構體的初始化

今天在工作時,看到了奇葩的結構體初始化方式,於是我查了一下c99標準文件和gcc的說明文件,終於搞清楚是怎麼回事了。假設有如下結構體定義 typedef struct mystruct 那麼結構體的初始化方式如下有三種 1 c89的初始化方式 mystruct test 這種初始化的優點是語法簡單,...

C 結構體初始化

今天在看mfc結構時,順便看了看 深入淺出mfc 發現有這麼一行 m pmainwnd new cmyframewnd 乍一看,很正常啊,再仔細一看,貌似 new cmyframewnd 的時候少了一對括號。奇怪!之後又翻了翻書,發現好多處都是這樣的。難道我弄錯了,不可能啊,一般情況下在new乙個新...