为什么不能返回strerror()的结果

时间:2013-06-18 16:23:33

标签: c casting strerror

根据手册页strerror(errnum)返回char *,但我收到以下警告:

gcc temp.c -o temp
temp.c: In function ‘mystrerror’:
temp.c:10:4: warning: return makes pointer from integer without a cast [enabled by default]

当我使用./temp 0而不是./temp 256运行时,我遇到了段错误。

有人可以解释为什么会发生这种情况以及如何解决它(如果可能的话)?

temp.c

#include <stdio.h>
#include <errno.h>

char *mystrerror(int errnum)
{
    switch (errnum) {
    case 256:
        return "My test";
    default:
        return strerror(errnum);
    }
}

int main(int argc, char **argv)
{
    int err;

    if (argc > 1) {
        err = atoi(argv[1]);
        printf("test error (%d) %s\n", err, mystrerror(err));
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

根据strerror手册页,其包含为#include <string.h>

没有函数定义C假设每个函数都返回int,这就是你得到编译器错误的原因。

答案 1 :(得分:3)

您缺少包含<string.h>标头文件。

Documentation.

编译器甚至会告诉您完全您的问题是什么:

  

return从没有强制转换的整数中生成指针

如果某个函数没有原型,则假定它返回int。并且看起来在您的平台上,指向char的指针不适合int,因此它被截断,然后printf()尝试取消引用这样无效的指针。