2012-10-31 125 views
1

我想更新函數中的密碼結構。 這個函數得到一個指向密碼結構的指針,其中 我必須更新細節。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*

這有點令人困惑,我希望我對某人有意義。

回答

0

您可以將前兩種方案合併爲*pw = *getpwnam("user2");。儘管如此,它仍然是一個淺的副本。

至於你的問題,如果你可以改變原型爲struct passwd* myfunc(struct passwd **pw)那麼你可以自己分配結構和所有需要的領域。然後有一個單獨的功能,用戶必須調用以釋放所有分配的數據。

+0

不,我不能更改函數原型,因爲有很多來電者。我不想改變所有這些功能:( – Ram

+0

@Ram然後你不得不忍受淺拷貝和靜態緩衝區。 –

相關問題