最近发现以下代码声明了char * p,分配了诸如p =" GOOD"之类的值。并返回return p。函数调用完成后返回值是否有效?
const char * get_state(int state)
{
char *p;
if (state) {
p = "GOOD";
}
else
{
p = "BAD";
}
return p;
}
答案 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()
只会返回指向其中一个内存位置的指针。