从函数返回char *的内容

时间:2013-04-10 13:22:48

标签: c pointers return-value string-literals

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

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

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

    return p;
}

3 个答案:

答案 0 :(得分:6)

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

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

// Valid
char *p = "GOOD";
return p;

答案 1 :(得分:3)

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

如果返回的指针指向局部变量,则会出现问题,例如:

// BAD! You cannot use the return value of this function!
const char * get_state(int state)
{
    char c;
    return &c;
}

答案 2 :(得分:1)

  
      
  • 函数调用完成后返回值是否有效?
  •   

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

(C规范第6.2.4节第3节)

  

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

因此,C语言保证字符串"GOOD""BAD"在程序中的任何位置都可用,而get_state()只会返回指向其中一个内存位置的指针。