虽然以下功能适用于g ++ 4.8.3(使用C ++ 11)
char* fn() {
return '\0';
}
clang ++ 3.6(使用C ++ 11)会产生以下错误:
cannot initialize return object of type 'char *' with an rvalue of type 'char'
那么为什么这种差异以及如何使这两种编译器能够正常工作呢?
答案 0 :(得分:2)
以下功能适用于g ++ 4.8.3 [...]
函数编译的事实并不意味着它实际上有效。代码返回一个转换为指针的字符常量。
如果要返回指向'\0'
的指针,则需要将其分配到内存中某些位置,该位置在函数返回时不会失效,例如:使用static
或new
:
char* fn1() {
static char res = '\0';
return &res;
}
或
char* fn2() {
char *res = new char;
*res = '\0';
return res;
}
fn1
的来电者需要注意他们对结果所指向的char
所做的更改,因为它在所有来电者之间共享。
另一方面,fn2
的来电者在完成结果后必须致电delete
,以避免内存泄漏。
答案 1 :(得分:2)
您的代码不会将char转换为char *,而是提升char' \ 0'到nullptr。它使用普通return 0