我comedilib在一個 C 程式中作業,我試圖理解這一行:
comedi_cmd c, *cmd = &c;
comedi_cmd是一個包含一堆整數和一個指向資料陣列的指標的結構。該變數c未在其他任何地方使用。如果我省略創建c并執行以下操作:
comedi_cmd *cmd;
...然后我開始出現段錯誤。
為什么我們不能簡單地創建指向comedi_cmd結構的指標?這是一種分配記憶體的方式嗎?
這是我不知道的一些 C 魔法嗎?
有關更多背景關系,comedilib示例中的問題行在這里:https :
//github.com/Linux-Commedi/comedlib/blob/master/demo/tut3.c#L68
uj5u.com熱心網友回復:
讓我們把這條線分成兩行:
comedi_cmd c;
comedi_cmd *cmd = &c;
第一行的作用是在堆疊上分配足夠的記憶體以包含c型別的變數comedi_cmd。這就是你的一堆整數和一個指標將存盤在記憶體中的地方。
第二行定義cmd了一個指向 的指標comedi_cmd,并用 的地址初始化它c,這是整數串和一個指標存盤在記憶體中的位置。
如果要定義cmd未初始化:
comedi_cmd *cmd;
那么它將有一個未定義的值(地址)。SIGSEGV正如您所觀察到的那樣,取消參考它可能會導致。您必須確保cmd指向有效記憶體,并且c在這種情況下是有效記憶體。
uj5u.com熱心網友回復:
很明顯,您需要創建一個結構型別的物件,其中包含“一堆整數和一個指向資料陣列的指標”。
此物件將在某些功能中更改。要在函式內準確更改物件而不是物件的副本,您需要通過參考將其傳遞給函式。
在 C 中,通過參考傳遞意味著通過指向物件的指標間接傳遞物件。取消參考指標函式將直接訪問傳遞的物件。
您可以撰寫例如呼叫函式
some_function( &c );
但是,您可以引入指標型別的中間變數,例如
comedi_cmd *cmd = &c;
并在函式呼叫中使用它而不是運算式&c。
some_function( cmd );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386330.html
