C:从函数

时间:2017-03-21 17:03:19

标签: c pointers

当我练习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],它就不会像我预期的那样工作。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

它仍然有效,因为数组包含指向字符串文字的指针。字符串文字具有静态存储持续时间,即使保存其地址的数组也不具有静态存储持续时间。

事实上,优化编译器应该明智,并在两种情况下生成相同的代码。

但是,当您返回name时,您所遵循的规则也适用。所以你得到了未定义的行为。虽然除非您更改函数的返回类型,否则返回name不应该编译,因为char*char**是不兼容的类型。