我想更新函數中的密碼結構。 這個函數得到一個指向密碼結構的指針,其中 我必須更新細節。getpwnam getpwnam_r
我得到一個struct passwd*
作爲參數的功能,我的要求是將其成員更新爲其他用戶的(user2)信息,並且此函數的調用者應具有所有這些更新的細節。
我試過了,你能幫我建議什麼是理想的做法。
我的功能是這樣的:
struct passwd* myfunc(struct passwd *pw)
對此pw
,我必須更新的詳細信息。
Try1:
使用getpwnam()
得到的user2的細節到通過struct passwd *pw
。
pw = getpwnam("user2");
return pw;
不行的,因爲我們沒有更新PW的成員,而我們只是指着pw
一些其他結構中,pw
指針成員,仍然指向舊數據。 因此,myfunc()
的父母沒有得到更新的細節。
我們必須寫入成員。
Try2:
使用getpwnam()
得到的user2的細節到一個臨時struct passwd*
。 做一個memcpy(pw, temppasswd, sizeof(struct passwd))
爲memcpy
不工作時是淺拷貝和隨之而來的getpwnam()
(雖然回報不給temppasswd
)將在寫靜態緩衝區,並pw
可能有不同的值。
Try3:
試過getpwnam_r()
其寫入到細節緩衝器作爲參數傳遞給它,而不是成靜態數據區(如)。
不能使用這個,因爲我沒有pw
,我有*pw
。 因此,我無法將分配給pw
的內存地址傳遞給getpwnam_r
。
嘗試4:
我可以通過會員副本Try2做的成員,但它可能會導致內存泄漏,如果我將數據複製到它們之前千萬不要隨意pw
結構指針成員。
是否有任何其他方式複製細節通過pw*
而不釋放所有結構指針成員結構pw*
。
這有點令人困惑,我希望我對某人有意義。
不,我不能更改函數原型,因爲有很多來電者。我不想改變所有這些功能:( – Ram
@Ram然後你不得不忍受淺拷貝和靜態緩衝區。 –