char *strerror_r(int errnum, char *buf, size_t buflen);
这些buf
/ buflen
参数是什么?
char* buf = nullptr;
fprintf(stderr, strerror_r(errno, buf, 0));
char buf[1024];
fprintf(stderr, "%s\n", strerror_r(errno, buf, sizeof buf)); // Correct message here
fprintf(stderr, "%s\n", buf); // Empty
答案 0 :(得分:3)
引用man page,强调我的
GNU特定的
strerror_r()
返回指向包含错误消息的字符串的指针。 这可以是指向函数存储在buf
中的字符串的指针,也可以是指向某些(不可变的)静态字符串的指针(在这种情况下buf
未使用) 强>
因此buf
很可能未被使用,如果buf
未使用,则buflen
无关紧要。
[....] 如果函数在
buf
中存储字符串,则最多存储buflen
个字节(如果{{1,则字符串可能会被截断) }}太小而buflen
未知)。 [...]
答案 1 :(得分:1)
正如您在评论中注意到的,仅当您传递无效 errnum ,否定或未知错误时,才会使用 buf 和 buflen 参数价值。这由the source code of the function确认。
char *
__strerror_r (int errnum, char *buf, size_t buflen)
{
if (__builtin_expect (errnum < 0 || errnum >= _sys_nerr_internal
|| _sys_errlist_internal[errnum] == NULL, 0))
{
/* To fill up buf with "Unknown error" localized string and to append
digits of errnum. Nothing happens if buflen equals zero. */
...
return buf;
}
return (char *) _(_sys_errlist_internal[errnum]);
}
在缓冲区的容量中,我认为1024字节就足够了。此外,它与 strerror 实现使用的完全相同的大小(该线程不安全)。另请参阅the related answer and the comment to it。
当然,这一切都与GNU版本的功能有关。符合XSI的版本始终使用此缓冲区来复制静态字符串。