当我练习K&节的第5.8节(第113页)时,我有疑问。 R C编程语言。
原始源代码在这里
/* month_name: return name of n-th month */
char *month_name(int n)
{
static char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
return (n < 1 || n > 12) ? name[0] : name[n];
}
而且我已经知道我们无法返回局部变量的指针,因为它来自堆栈并且在函数返回后它将被销毁(?)。但在这个例子中,他们使用static来保留变量。
问题是&#34;为什么在我删除静态表示法后它们仍然有用&#34;。
我将代码更改为
/* month_name: return name of n-th month */
char *month_name(int n)
{
char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
return (n < 1 || n > 12) ? name[0] : name[n];
}
并且它们仍能很好地工作。
BUT。如果我返回name
而不是name[n]
,它就不会像我预期的那样工作。
为什么会这样?
答案 0 :(得分:2)
它仍然有效,因为数组包含指向字符串文字的指针。字符串文字具有静态存储持续时间,即使保存其地址的数组也不具有静态存储持续时间。
事实上,优化编译器应该明智,并在两种情况下生成相同的代码。
但是,当您返回name
时,您所遵循的规则也适用。所以你得到了未定义的行为。虽然除非您更改函数的返回类型,否则返回name
不应该编译,因为char*
和char**
是不兼容的类型。