【问题标题】:Returning a locally created const char*返回本地创建的 const char*
【发布时间】:2018-12-07 00:02:31
【问题描述】:
#include <iostream>


const char* fun()
{
    const char* x = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}


int main(int arc, char** argv)
{
    const char* y = fun();
    std::cout << "y = " << y << "\n";
    return 0;
}

在我的机器上运行它会得到:

x = abc

y = abc

fun()中,x(一个局部变量)被分配了一个本地创建的字符串字面量的地址,但是当函数返回时,y指向的数据与@指向的数据相同987654326@ 即使x 超出范围。

有人可以详细解释这里发生了什么吗?

【问题讨论】:

  • 你缺少的一点是一个函数可能总是返回一个它自己类型的值。指针的警告是函数返回后它们指向的内容必须仍然存在。 @songuyanyao 解释如下。

标签: c++ pointers return lifetime string-literals


【解决方案1】:

这是格式正确的,返回的指针是有效的并且没有悬空;因为string literal(即"abc")具有静态存储时长,并且存在于程序的整个生命周期中。

字符串字面量具有静态存储持续时间,因此在程序的整个生命周期内都存在于内存中。

正如你所说,当函数返回局部变量 x 时,它会被破坏,但它指向的字符串文字不会。

【讨论】:

    【解决方案2】:

    至于你的功能fun

    const char* fun(){
        const char* x = "abc";
        std::cout << "x = " << x << "\n";
        return x;
    }// the pointer returns but it's content still alive, because it points to string literal
    

    如果您将函数fun 更改为以下内容:

    const char* fun(){
        char x[] = "abc";
        std::cout << "x = " << x << "\n";
        return x;
    }// the pointer returns but it's content died
    

    然后:

    const char* y = fun();
    std::cout << "y = " << y << "\n"; 
    

    按预期输出(y 为 ''):

    由于上面的const char* x = "abc";不是局部变量,而是string literal,它具有静态存储时长,并且存在于程序的整个生命周期中。

    对面的char x[] = "abc"; 是局部变量,当超出范围时会死掉。

    【讨论】:

    • 你只说对了 1/2。不管是char x[] 还是char *x,重要的是"abc";"abc" 是在 .rodata(只读)数据段中创建的 sting literal。无论你如何声明xreturn x 都会返回一个指针,该指针包含文字中第一个字符的地址。
    • 我只是举个例子。为了更好地理解。
    • 好的,声明 "On 相反 char x[] = "abc"; 是局部变量,超出范围时会死掉。" 不清楚。 (看来您对 "On 相反" 的使用是对 "Inapposite" 的尝试,请参阅Merriam-Wester
    • 对于具有未定义行为的程序没有“预期”。任何事情都可能发生,包括与正确程序完全相同的工作。我会说类似“毫不奇怪,这个程序的行为不同:”。
    猜你喜欢
    • 2011-02-17
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2021-08-27
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多