3
const char* test(bool i)
{
    const char t[] = "aa\n";
    const char* p = "bbb\n";
    if(i)
        return p;
    return t;
}
int main(array<System::String ^> ^args)
{
     printf(test(true));
     printf(test(false));
     return 0;
}

这会返回某种东西:

 bbb
 %^&$^$%

很明显test(false)返回一个指向局部变量的指针。问题是 p 也是局部变量。为什么函数返回后没有清理“bbb\n”的内存。我认为 const char[] 的解释方式与 const char* 相同,但它看起来并不正确。

4

2 回答 2

6

虽然p是局部变量,但它指向的不是局部变量——它是一个编译时字符串常量;从函数返回该常量的地址是合法的。

t不同,因为编译时字符串常量被复制到一个自动存储区域,导致在取消引用返回的指针时出现未定义的行为。

于 2012-05-19T21:20:54.220 回答
1

p是一个局部变量,您按值返回,但指向一个字符串字面量,它驻留在只读内存中,而不是在为该方法分配的自动内存中。

返回t并使用它确实会导致未定义的行为。

另外,不要认为指针和数组是等价的。

于 2012-05-19T21:21:24.547 回答