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