strerror_r无效

时间:2013-05-05 12:23:51

标签: c gcc

这是一个简单的程序来说明问题。

#include <string.h>
#include <iostream>

int main () {
    char buf [30];
    strerror_r (0, buf, sizeof (buf));

    std :: cout << "strerror_r(0): " << buf << std :: endl;
    std :: cout << "strerror(0): " << strerror (0) << std :: endl;
}

这是输出。

strerror_r(0): 
strerror(0): Success

为什么buf中没有任何内容?

(使用gcc在Ubuntu上编译。)

1 个答案:

答案 0 :(得分:5)

来自man strerror_r

  

在以下情况下提供符合XSI标准的strerror_r()版本:   (_POSIX_C_SOURCE&gt; = 200112L || _XOPEN_SOURCE&gt; = 600)&amp;&amp; ! _GNU_SOURCE   否则,将提供GNU特定版本。

并进一步向下:

  

GNU特定的strerror_r()返回指向包含错误消息的字符串的指针。这可以是指向函数存储在buf中的字符串的指针,也可以是指向某个(不可变的)静态字符串的指针(在这种情况下,buf未使用)。如果函数在buf中存储一个字符串,则最多存储buflen字节(如果buflen太小且errnum未知,则字符串可能被截断)。该字符串始终包含一个终止空字节。

程序必须使用特定于GNU的版本,而不是填充buf。我重现了已发布程序的行为,但存储了strerror_r()的返回值,它与buf的地址不同。