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