为什么我在下面给出的代码中遇到分段错误?
char getstr()
{
static char s[]="Hiii2015";
return s;
}
int main()
{
printf("%s",getstr());
return 0;
}
虽然我知道我使用char
返回类型返回一个地址,并且返回类型必须是char*
但是如果我这样做的话,那么我在gcc编译器和分段上变为null另一个编译器出错了,这个原因是什么呢
答案 0 :(得分:5)
getstr()
的返回类型错误。
只是char
,应该是const char *
或char *
,即指针。
按原样,您将返回的指针向下压缩到char
(可能只有8位),然后尝试从printf()
访问非常低的地址,这会给您带来未定义的行为。
您应该收到编译器警告。
答案 1 :(得分:3)
我在另一个编译器
上的gcc编译器和分段错误上变为空
undefined behavior非常深刻的迹象。在您的代码中,
printf("%s",getstr());
实际上调用undefined behavior,因为提供的参数不是所提供的格式说明符所期望的正确类型。
详细说明一下,引用C11
标准,章节§6.8.6.4,return
陈述,
如果执行带有表达式的
return
语句,则表达式的值为 作为函数调用表达式的值返回给调用者。如果表达式有 类型不同于它出现的函数的返回类型,值为 通过赋值给具有函数返回类型的对象进行转换。
因此,返回s
,好像转换为char
,表示错误的值。该值作为%s
的参数提供时,会通过UB创建所有问题。
遇到UB时,既不保证也不预测行为。