我正在尝试更新函数中的密码结构。 此函数获取指向密码结构的指针 我必须更新细节。
我得到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()
将详细信息写入作为参数传递给它的缓冲区而不是静态数据区域(如getpwnam
)。
无法使用此功能,因为我没有pw
,我有*pw
。
因此,我无法将分配给pw
的内存地址传递给getpwnam_r
。
尝试4:
我可以在Try2中通过成员副本执行成员,但如果在将数据复制到其中之前没有释放pw
结构指针成员,则可能导致内存泄漏。
在没有释放所有struct pw*
指针成员的情况下,是否有任何其他方法可以将详细信息复制到pw*
。
这有点令人困惑,我希望我对某人有意义。
答案 0 :(得分:0)
您可以将前两个选项合并为*pw = *getpwnam("user2");
。尽管如此,它仍然是一个浅薄的副本。
至于你的问题,如果你可以将原型更改为struct passwd* myfunc(struct passwd **pw)
,那么你可以自己分配结构和所有需要的字段。然后有一个单独的函数,用户必须调用该函数来释放所有已分配的数据。