【问题标题】:Why can't the result of strerror() be returned为什么strerror()的结果不能返回
【发布时间】:2013-06-18 16:23:33
【问题描述】:

根据手册页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 运行它时,我遇到了段错误。

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

温度.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;
}

【问题讨论】:

  • 您是否包含#include &lt;string.h&gt; 并尝试过?
  • 我不记得了; -Wall 会警告你在 C 中使用了未声明的函数吗?
  • 还有#include &lt;stdlib.h&gt; for atoi
  • @Wug 确实如此。
  • -Wall 再次拯救了这一天。

标签: c casting strerror


【解决方案1】:

您缺少包含 &lt;string.h&gt; 头文件。

Documentation.

编译器甚至会告诉你究竟你的问题是什么:

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

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

【讨论】:

  • 好吧,如果您对究竟问题是什么感兴趣,请使用-Wall
  • @KarolyHorvath 一总是使用-Wall。 (我也使用-Wextra -pedantic -pedantic-errors,但也许我只是受虐狂。)
  • 其实C99去掉了默认的int规则;调用没有可见声明的函数是非法的(实际上是违反约束)。但是很多编译器,包括 gcc,默认都是按照旧规则运行的。
  • @KeithThompson 是的,没错,gccclang 都拒绝发出诊断,除非 -std=c99 -pedantic 实际上存在。
  • 软件如果将其作为致命错误会少很多错误,除非指定了-std=c89
【解决方案2】:

根据 strerror 手册页,它的包含是 #include &lt;string.h&gt;

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

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2013-03-10
    相关资源
    最近更新 更多