返回一个指向静态变量的本地指针

Alc*_*ott 6 c static

这是代码,

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,这将是正确的,返回一个局部变量cbar

我试过,这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"保留在常量区域中,而不是在堆中,但概念是正确的:指向该常量的指针在程序的整个运行时间内保持有效.