如何处理strerror_r函数返回的指针?

时间:2013-10-28 16:54:38

标签: c linux pointers libc

我在Linux中使用libc的strerror_r函数。我用0表示缓冲区指针和缓冲区大小参数,它返回一个指向带有错误消息的字符串的指针。

我复制了字符串以供将来使用,但是如何处理返回的指针? 我应该以某种方式释放这个指针,还是指向一些静态消息表?

1 个答案:

答案 0 :(得分:2)

strerror_r的(GNU,非Posix)版本返回的字符串始终是静态字符串或您提供的缓冲区。它几乎总是一个静态字符串;仅当errno的值未知时才会动态创建错误字符串。

如果为缓冲区大小指定0,则永远不会使用缓冲区。如果它是必要的,它仍将被返回,这意味着在你的情况下,你可能会因为调用strerror_r而收到0。这可能不是你想要的。

Posix版本的strerror_r 始终使用您提供的缓冲区,并返回0,除非发生了一些错误(缓冲区耗尽将是一个错误,因此如果您将缓冲区指定为0使用Posix版本,您可以保证获得错误返回,这将作为副作用 - 破坏errno的先前值。

简而言之:

  1. 调用缓冲区长度为0的strerror_r是不正确的,但如果使用该函数的Gnu特定版本,绝大多数时间都无关紧要。

  2. 除非是你的缓冲区,否则你不需要复制字符串。使用与Posix兼容的strerror_r版本,无法知道静态字符串是否可用,因此您将始终最终复制缓冲区。