这是代码,
char *foo()
{
static char s[10] = "abcde";
return s;
}
char *bar()
{
char *c = foo();
return c;
}
int main()
{
printf("%s\n", bar());
}
Run Code Online (Sandbox Code Playgroud)
通常情况下,这是错误的,因为我的确在返回一个局部指针bar,但现在c指向一个static变种返回的foo,这将是正确的,返回一个局部变量c的bar?
我试过,这printf是正确的价值,但我不明白它是如何工作的.我想,当bar()完成时,var c应该消失,这应该是printf打印未定义的东西,对吧?
跟进
char *c是一个局部变量,如果char *c = "abcde";,我认为这一点:c是驻留在函数的堆栈一个局部变量,同时"abcde"是一个常数变种驻留在常量区(堆的一部分吗?),所以当bar()完成,c消失,但"abcde"仍还在堆里,对吗?
das*_*ght 10
变量c只是一个指针.从函数返回本地指针并没有错,你总是这样做.例如,当您将结果存储malloc在指针中时,指针是本地的,但它指向的存储不是.但是,返回指向本地存储的指针是错误的.由于在您的示例中c从不指向本地分配的数据,因此您的代码可以正确编写.
编辑(回应跟进)
"abcde"是一个常量var,它位于常量区域(堆的一部分?)
常量区域通常不是堆的一部分,它是一个单独的arrea,通常与存储程序的机器代码的区域相邻.
c消失了,但是"abcde"仍然在堆里,对吧?
"abcde"保留在常量区域中,而不是在堆中,但概念是正确的:指向该常量的指针在程序的整个运行时间内保持有效.