我对以下代码有疑问
int main ( )
{
return "hello" ;
}
在上面的代码中我们必须返回int,但是我们将返回字符串。代码将编译一个警告,即
" return从指针生成整数而没有强制转换(默认情况下启用)"
请解释上述情况会发生什么?
答案 0 :(得分:4)
如果允许从char*
到int
(通过char [6]
到char*
)的隐式转换,则返回的int
将具有字符串文字中第一个元素的地址。如果这会溢出int
,则会出现未定义的行为。如果没有,可以假设这是一个非零值,操作系统将其解释为失败退出代码 * 。
*请注意,main
允许的返回值范围可以限制为8位,有符号或无符号,因此可以在此处进行第二次溢出。
答案 1 :(得分:2)
但我们正在返回字符串
return
字符串本质上意味着返回字符串的基地址,这只是一个指针。
根据第6.8.6.4章,C11
标准,第3段,
如果执行带有表达式的return语句,则表达式的值为 作为函数调用表达式的值返回给调用者。如果表达式有 类型不同于它出现的函数的返回类型,值为 通过赋值给具有函数返回类型的对象进行转换。
也就是说,字符串"hello"
的基指针将转换为int
,并将返回给操作系统。所以,这里发生指针到整数的转换,产生警告。
但是,值得一提的是,此转换既不是安全也不是可靠。正如评论中 @Lundin 先生所提到的,转换的结果是实现定义的。
注意:通常,非零退出代码表示程序出现故障,因此操作系统可能会将您的程序视为失败。
答案 2 :(得分:0)
当"hello"
作为int
返回时,它将指针地址"hello"
作为整数。作为非零整数,将假定程序已退出为失败。
答案 3 :(得分:0)
您将返回字符串数据的内存地址。