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
foratoi
@Wug它肯定会这样。-沃尔又一次拯救了一天。你有没有包括#include
并尝试过?我记不清了;Wall会警告你在C语言中使用了一个未声明的函数吗?还有#include
foratoi
@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;
}