在下面的C代码中获取分段错误?

时间:2015-11-05 10:38:41

标签: c string segmentation-fault

为什么我在下面给出的代码中遇到分段错误?

char getstr()
{
  static char s[]="Hiii2015";
  return s;
}

int main()
{
  printf("%s",getstr());
  return 0;
}

虽然我知道我使用char返回类型返回一个地址,并且返回类型必须是char*但是如果我这样做的话,那么我在gcc编译器和分段上变为null另一个编译器出错了,这个原因是什么呢

2 个答案:

答案 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时,既不保证也不预测行为。