我在 Linux 中使用 libc 中的 strerror_r 函数。我用 0 调用它作为缓冲区指针和缓冲区大小参数,它返回一个指向带有错误消息的字符串的指针。
我制作了字符串的副本以备将来使用,但是如何处理返回的指针?我应该以某种方式释放这个指针,还是指向某个静态消息表?
(GNU,非 Posix)版本返回的字符串strerror_r
始终是静态字符串或您提供的缓冲区。它几乎总是一个静态字符串;errno
仅当 的值未知时,才会动态创建错误字符串。
如果您将缓冲区大小指定为 0,那么您的缓冲区将永远不会被使用。如果有必要,它仍然会返回,这意味着在您的情况下,您可能会收到 0 作为调用的结果strerror_r
。这可能不是你想要的。
Posix 版本strerror_r
始终使用您提供的缓冲区,除非发生错误,否则返回 0(缓冲区用完将是一个错误,因此如果您在 Posix 版本中将缓冲区指定为 0,则可以保证得到错误返回,这将 - 作为副作用 - 破坏errno
.
简而言之:
使用缓冲区长度 0 进行调用strerror_r
是不正确的,尽管如果您使用该函数的 Gnu 特定版本,绝大多数情况下它都无关紧要。
您不需要复制字符串,除非它是您的缓冲区。使用与 Posix 兼容的 strerror_r 版本,不可能知道静态字符串是否可用,因此您总是会复制缓冲区。