3

最近遇到了以下代码,它声明了一个 char *p,分配了诸如 p="GOOD" 之类的值并返回 return p。函数调用完成后返回值是否有效?

const char * get_state(int state)
{
    char *p;

    if (state) {
        p = "GOOD";
    }
    else
    {
        p = "BAD";
    }

    return p;
}
4

3 回答 3

6

是的,它是有效的。字符串字面量"GOOD"和保证在永久的静态存储中,并且即使在返回"BAD"后也将继续存在。get_state()

// Invalid
char str[] = "GOOD";
char *p = str;
return p;

// Valid
char *p = "GOOD";
return p;
于 2013-04-10T13:28:10.653 回答
3

在这种特定情况下,返回值很好,因为它指向静态存储(在进程期间分配字符串文字的内存)。

如果返回的指针指向一个局部变量,那么就会出现问题,例如:

// BAD! You cannot use the return value of this function!
const char * get_state(int state)
{
    char c;
    return &c;
}
于 2013-04-10T13:28:36.383 回答
1
  • 函数调用完成后返回值是否有效?

是的,因为p指向字符串文字,所以字符串文字具有静态存储持续时间,这意味着:

(C 规范的第 6.2.4 p3 节)

它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次。

因此,C 语言保证字符串在您的程序中随处可用,并且"GOOD"只会返回指向这些内存位置之一的指针。"BAD"get_state()

于 2013-04-10T13:45:19.537 回答