1

関数内のパスワード構造を更新しようとしています。この関数は、詳細を更新する必要があるパスワード構造へのポインターを取得します。

引数として関数を取得しstruct passwd*ます。私の要件は、そのメンバーを別のユーザー (user2) の情報に更新することであり、この関数の呼び出し元には、これらすべての更新された詳細が必要です。

私は次のことを試しました。それを行うための理想的な方法を提案してください。

私の機能は次のようなものです:

struct passwd* myfunc(struct passwd *pw)

これpwには、詳細を更新する必要があります。

試行 1:

getpwnam()user2 の get details を passed に使用しますstruct passwd *pw

pw = getpwnam("user2");
return pw;

pw メンバーを更新しているのではなくpw、他の構造体、 のポインター メンバーを指しているだけなpwので、まだ古いデータを指しているため、機能しません。したがって、の親はmyfunc()更新された詳細を取得しません。

メンバーに書き込む必要があります。

試行 2:

getpwnam()user2 の詳細を temp に取得しますstruct passwd*。するmemcpy(pw, temppasswd, sizeof(struct passwd))

memcpyは浅いコピーとして機能せず、結果としてgetpwnam()(戻り値は に与えられませんがtemppasswd) 静的バッファー領域を上書きし、pw異なる値を持つ可能性があります。

トライ3:

getpwnam_r()詳細を静的データ領域(のような)ではなく、引数として渡されたバッファに書き込む方法を試しましたgetpwnam

pwを持っていないため、これを使用できません*pwpwそのため、 に割り当てられたメモリのアドレスを渡すことができませんgetpwnam_r

4 を試してください:

pwTry2 でメンバーごとにコピーできますが、データをコピーする前に構造体ポインター メンバーを解放しないと、メモリ リークが発生する可能性があります。

すべての構造体ポインター メンバーpw*を解放せずに、渡された詳細をコピーする他の方法はありますか。pw*

少しややこしいですが、誰かに理解してもらえれば幸いです。

4

1 に答える 1

0

最初の 2 つの選択肢を として組み合わせることができます*pw = *getpwnam("user2");。ただし、それはまだ浅いコピーです。

あなたの問題に関しては、プロトタイプを変更できる場合はstruct passwd* myfunc(struct passwd **pw)、構造体と必要なすべてのフィールドを自分で割り当てることができます。次に、割り当てられたすべてのデータを解放するためにユーザーが呼び出す必要がある別の関数を用意します。

于 2012-10-31T06:23:44.333 に答える