我得到了這個函式原型void create_smth(smth* s) ,并要求這個函式創建、初始化并回傳一個 smth 變數。這甚至可能嗎?據我所知,我需要一個雙指標來做這樣的事情。我在這個功能中所做的是
s=(smth*)malloc(sizeof(smth));
這大概是錯誤。
在我的主要我已經嘗試過
smth* smth1=NULL;
create_smth(smth1);
和
smth smth1;
create_smth(&smth1);
但我的代碼一直崩潰(分段錯誤;核心轉儲)。我開始懷疑這是否是教練的錯誤,但直接問他很愚蠢,但練習需要我上面所說的。謝謝大家。
uj5u.com熱心網友回復:
對我來說看起來像是導師的錯誤。您是正確的,void create_smth(smth* s)原型不能回傳值,無論是傳統return意義上的(它是void),還是使用雙指標。只有兩種方法可以做到這一點:
smth* creat_smth()
{
smth* mySmth = malloc(sizeof *mySmth);
// check malloc return valid pointer, initialize fields with mySmth->
return mySmth;
}
int main(void)
{
smth* smth1 = creat_smth();
...
return 0;
}
或者
void creat_smth(smth** mySmth)
{
*mySmth = malloc(sizeof **mySmth);
// check malloc returned valid pointer, initialize fields with (*mySmth)->
}
int main(void)
{
smit* smth1;
creat_smth(&smth1);
...
return 0;
}
uj5u.com熱心網友回復:
值得向您的導師尋求澄清。也就是說,具有遵循該模式的函式至少在某種程度上是常見的int init_smth(smth *x)- 但請注意名稱:此類函式通常被稱為init_?,而不是create_?(因為它不會為該物件創建存盤,它只是填充它)。
當預計堆疊分配結構是正確的事情時,這是有道理的。malloc用戶將傳遞一個指向本地分配結構的指標,而不是使用:
smth my_smth;
init_smth(&my_smth);
并且在init_smth一些中等復雜的初始化中會發生(但同樣沒有malloc:物件的記憶體已經分配)。
然而,即使如此,函式回傳一個指示成功的狀態代碼也更為常見(因此是int我上面原型中的回傳型別)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/333850.html
