返回本地创建的 const char*
Posted
技术标签:
【中文标题】返回本地创建的 const char*【英文标题】:Returning a locally created 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 解释如下。 【参考方案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。无论你如何声明x
,return x
都会返回一个指针,该指针包含文字中第一个字符的地址。
我只是举个例子。为了更好地理解。
好的,声明 "On 相反 char x[] = "abc"; 是局部变量,超出范围时会死掉。" 不清楚。 (看来您对 "On 相反" 的使用是对 "Inapposite" 的尝试,请参阅Merriam-Wester)
对于具有未定义行为的程序没有“预期”。任何事情都可能发生,包括与正确程序完全相同的工作。我会说类似“毫不奇怪,这个程序的行为不同:”。以上是关于返回本地创建的 const char*的主要内容,如果未能解决你的问题,请参考以下文章
为啥我可以从 char * const 值创建 char * 向量?
Skia 如何使用 SkTypeface* CreateFromFile(const char path[]) 从资产创建字体;
C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?
模板类 char*,函数 const char* 的返回类型?