【问题标题】:Functions and return const char*函数和返回 const char*
【发布时间】:2012-05-26 23:45:15
【问题描述】:
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* 相同,但事实并非如此。

【问题讨论】:

    标签: arrays c++-cli char constants


    【解决方案1】:

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

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

    【讨论】:

    • 严格来说,它不是返回导致未定义行为的指针,而是稍后解引用它。
    • @BenVoigt 你是绝对正确的,我编辑了答案以澄清这一点。
    【解决方案2】:

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

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

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

    【讨论】:

    • 标准是否规定了字符串文字的存储方式?即,字符串(通常的经验)在只读内存中,直到整个程序结束时才会存在,这是标准的强制性行为吗?如果不是,它可能存在一个编译器,将字符串文字放入函数的堆栈中......为什么不(如果标准没有规定任何内容)
    • @ShinTakezou:第 3.7.1 节:“所有没有动态存储持续时间、没有线程存储持续时间和非本地变量都有静态存储持续时间。这些实体的存储应持续在节目期间。”
    • @BenVoigt 谢谢。即使要“精确”的字符串文字不是变量,所以本节也不适用于它们。但我认为这是一个“细微差别”,并且该部分(也)指的是字符串文字。
    • @ShinTakezou:脚注 170,第 433 页,也明确声称字符串文字是静态的。
    • @BenVoigt 再次感谢。这是一个更有力的“证据”。 (可以肯定的是,我们是在谈论 C++ 标准,对吗?)
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2012-02-18
    • 1970-01-01
    • 2022-01-16
    • 2016-06-10
    • 2013-11-14
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多