最近遇到了以下代码,它声明了一个 char *p,分配了诸如 p="GOOD" 之类的值并返回 return p。函数调用完成后返回值是否有效?
const char * get_state(int state)
{
char *p;
if (state) {
p = "GOOD";
}
else
{
p = "BAD";
}
return p;
}
最近遇到了以下代码,它声明了一个 char *p,分配了诸如 p="GOOD" 之类的值并返回 return p。函数调用完成后返回值是否有效?
const char * get_state(int state)
{
char *p;
if (state) {
p = "GOOD";
}
else
{
p = "BAD";
}
return p;
}
是的,它是有效的。字符串字面量"GOOD"
和保证在永久的静态存储中,并且即使在返回"BAD"
后也将继续存在。get_state()
// Invalid
char str[] = "GOOD";
char *p = str;
return p;
// Valid
char *p = "GOOD";
return p;
在这种特定情况下,返回值很好,因为它指向静态存储(在进程期间分配字符串文字的内存)。
如果返回的指针指向一个局部变量,那么就会出现问题,例如:
// BAD! You cannot use the return value of this function!
const char * get_state(int state)
{
char c;
return &c;
}
- 函数调用完成后返回值是否有效?
是的,因为p
指向字符串文字,所以字符串文字具有静态存储持续时间,这意味着:
(C 规范的第 6.2.4 p3 节)
它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次。
因此,C 语言保证字符串在您的程序中随处可用,并且"GOOD"
只会返回指向这些内存位置之一的指针。"BAD"
get_state()