関数内のパスワード構造を更新しようとしています。この関数は、詳細を更新する必要があるパスワード構造へのポインターを取得します。
引数として関数を取得し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
を持っていないため、これを使用できません*pw
。pw
そのため、 に割り当てられたメモリのアドレスを渡すことができませんgetpwnam_r
。
4 を試してください:
pw
Try2 でメンバーごとにコピーできますが、データをコピーする前に構造体ポインター メンバーを解放しないと、メモリ リークが発生する可能性があります。
すべての構造体ポインター メンバーpw*
を解放せずに、渡された詳細をコピーする他の方法はありますか。pw*
少しややこしいですが、誰かに理解してもらえれば幸いです。