我正在尝试更新函数中的密码结构。 此函数获取指向密码结构的指针,其中 我必须更新详细信息。
我得到一个函数的 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
。
Try 4:
我可以在 Try2 中逐个成员复制,但如果我在将数据复制到成员之前不释放 pw
结构指针成员,可能会导致内存泄漏。
是否有任何其他方法可以将详细信息复制到传递的 pw*
而无需释放所有结构 pw*
指针成员。
这有点令人困惑,我希望我对某人有意义。
最佳答案
您可以将前两个选项组合为 *pw = *getpwnam("user2");
。尽管如此,它仍然是一个浅拷贝。
至于您的问题,如果您可以将原型(prototype)更改为 struct passwd* myfunc(struct passwd **pw)
,那么您可以自己分配结构和所有需要的字段。然后有一个单独的函数,用户必须调用该函数来释放所有分配的数据。
关于c - getpwnam getpwnam_r,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151961/