C 为什么可以';t无法返回strerror()的结果

C 为什么可以';t无法返回strerror()的结果,c,casting,strerror,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运行它时,我得到一个segfault,但不是/temp 256 有人能解释一下为什么会发生这种情况,以及如

根据手册页
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
运行它时,我得到一个segfault,但不是
/temp 256

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

温度c
#包括
#包括
char*mystrerror(int errnum)
{
开关(errnum){
案例256:
返回“我的测试”;
违约:
返回strerror(errnum);
}
}
int main(int argc,字符**argv)
{
INTERR;
如果(argc>1){
err=atoi(argv[1]);
printf(“测试错误(%d)%s\n”,err,mystrerror(err));
}
返回0;
}

根据strerror手册页,其包含为
\include


如果没有函数定义,C假设每个函数都返回int,这就是为什么会出现编译器错误。

根据strerror手册页,它的include是
#include


在没有函数定义的情况下,C假定每个函数都返回int,这就是为什么会出现编译器错误。

缺少
头文件的包含

编译器甚至会准确地告诉您您的问题是什么:

return从整数生成指针,不使用强制转换


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

您缺少
头文件的包含

编译器甚至会准确地告诉您您的问题是什么:

return从整数生成指针,不使用强制转换


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

您是否包括
#包括
并尝试过?我记不清了;威尔-沃尔会警告你在C语言中使用了一个未声明的函数吗?还有
#include
for
atoi
@Wug它肯定会这样。-沃尔又一次拯救了一天。你有没有包括
#include
并尝试过?我记不清了;Wall会警告你在C语言中使用了一个未声明的函数吗?还有
#include
for
atoi
@Wug它肯定会这样。-Wall又一次拯救了一天。好吧,如果你感兴趣的话,使用
-Wall
@KarolyHorvath One总是使用
-Wall
。(我也使用了
-Wextra-pedantic-pedantic错误,但可能我只是受虐狂。)实际上C99放弃了默认的
int
规则;调用没有可见声明的函数是非法的(实际上是违反了约束)。但是许多编译器,包括gcc,默认情况下都在旧规则下运行。@KeithThompson是的,这是正确的,
gcc
clang
都拒绝发出诊断,除非存在
-std=c99-pedantic
,事实上。如果软件将此作为致命错误,则其错误会少得多,除非指定了
-std=c89
。好吧,如果您对问题的确切原因感兴趣,请使用
-Wall
@KarolyHorvath One始终使用
-Wall
。(我也使用了
-Wextra-pedantic-pedantic错误,但可能我只是受虐狂。)实际上C99放弃了默认的
int
规则;调用没有可见声明的函数是非法的(实际上是违反了约束)。但是许多编译器,包括gcc,默认情况下都在旧规则下运行。@KeithThompson是的,这是正确的,
gcc
clang
都拒绝发出诊断,除非存在
-std=c99-pedantic
,事实上,如果软件将此作为一个致命错误,那么它的错误就会少得多,除非指定了
-std=c89
#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;
}