在 GCC 中,至少您的代码在编译时会出现以下警告:
main.c:12:19: warning: initializer-string for array of chars is too long
main.c:13:12: warning: function returns address of local variable [-Wreturn-local-addr]
这或多或少是对您问题的直接回答。如果您没有收到这些警告,请考虑切换您正在使用的编译器,对于 GCC,我建议至少 -Wall -Werror - 这将输出最有用的警告而不是迂腐,并且使这些警告错误因此将阻止成功编译,直到您修复他们。
您正在返回一个指向本地自动变量的指针,该变量在函数返回后不再位于范围内,因此结果未定义。您还尝试使用您保留的更多字符来初始化一个数组。
编译器在这里所做的是给定了无效的初始化程序,它将hi的地址设置为null,并且printf通过打印(null)来处理空指针。这是特定于您的编译器和 C 库的行为 - 在其他情况下可能会发生不同的情况。更阴险的是,如果您的初始化程序不是无效的(通过更短),它很可能 似乎 可以工作,而您可能从未问过这个问题,但它仍然是不正确的,并且在更复杂的代码中可能会在某些时候导致可观察到的错误行为。
在这种特殊情况下,您可以执行以下任何操作:
const char* str()
{
static const char* hi = "return this";
return hi;
}
const char* str()
{
static const char hi[] = "return this";
return hi;
}
char* str( char* str, int maxlen )
{
str[maxlen] = '\0' ;
return strncpy( str, "return this", maxlen - 1 ) ;
}
void main()
{
char* buffer[32] ;
printf("%s", str(buffer, sizeof(buffer));
}
最合适的解决方案(以上绝不是详尽的)取决于您实际想要做什么,因为每个解决方案在语义上都不同,而且这个功能本身几乎不实用。它需要一个具体的真实示例来提供最佳建议。