字符串常量在C ++中可以生存多长时间?

司力孔

我一直想知道,字符串常量在C ++中可以生存多长时间。例如,如果我在函数内创建一些const char * str =“ something”,返回str的值是否安全?

我编写了一个示例程序,很惊讶地看到这样的返回值仍然存储了该字符串。这是代码:

#include <iostream>
using namespace std;

const char *func1()
{
    const char *c = "I am a string too";
    return c;
}

void func2(const char *c = "I'm a default string")
{
    cout << c << endl;
}

const int *func3()
{
    const int &b = 10;
    return &b;
}

int main()
{
    const char *c = "I'm a string";
    cout << c << endl;
    cout << func1() << endl;
    func2();
    func2("I'm not a default string");
    cout << *func3() << endl;
    return 0;
}

它给了我以下输出:

我是弦乐

我也是弦

我是默认字符串

我不是默认字符串

10

func3只是在查找是否可以与其他类型一起使用。
因此,问题是:返回指向在该函数内创建的字符串常量的指针是否安全(如func1()一样)?
另外,像func2()一样使用默认字符串值是否安全?

沙菲克·雅格慕(Shafik Yaghmour)

字符串文字具有静态的存储期限,并可以延长程序的寿命。草案C ++标准2.14.5 字符串文字段落8它说(重点矿山前进):

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“ n const char的数组”,其中n是如下定义的字符串的大小,并且具有静态存储持续时间(3.7)。

并从“3.7.1 静态存储持续时间”1节中

所有没有动态存储持续时间,没有线程存储持续时间以及非本地变量的变量都具有静态存储持续时间。这些实体的存储应在程序的整个过程中持续(3.6.2、3.6.3)。

func3另一方面,第二种情况无效。引用的临时绑定的生存期在引用的生存期内一直存在,在这种情况下,函数返回时将终止。这部分12.2内容涵盖

第二种情况是引用绑定到临时项时。115引用所绑定的临时对象或引用所绑定的子对象的完整对象的临时对象在引用的生存期内一直存在,但以下情况除外

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#引用类型在方法中可以保留多长时间?

double在12个字节中能容纳这么多字符多长时间?

为什么这不能告诉我字符串向量多长时间?

了解C ++,学习Java需要多长时间?

在C ++中定义常量C字符串的正确方法?

我可以通过在C#中串联字符串和整数常量来创建字符串常量吗?

在SQL Server中需要多长时间varchar才能从C#中保存base64String?

有没有办法告诉复制函数制作字符串多长时间?

创建表时,默认的Laravel 4“字符串”有多长时间?如何覆盖默认值?

Java中的if语句可以有多长时间?

C#计算距离指定时间跨度还有多长时间

我可以修改常量字符串

学习C#进行游戏开发需要多长时间?

Java中字符串常量的串联

在Java中定义常量字符串?

AppleScript中的字符串常量

如何将字符常量连接到字符串中。C

我可以在protobuf中定义常量字符串吗?

C中的shellscript:使用awk获取失控的字符串常量错误

C ++:多行字符串常量中的行尾是否有标准定义?

为什么C ++中的字符串文字(char *)必须是常量?

C ++ 11 constexpr函数中的常量表达式字符串参数

C中的常量表达式-如何哈希字符串?

检查Objective-C中是否存在字符串常量

用sprintf和#define常量在C中填充字符串

在C ++ 17中引用常量字符串的语义应该是什么?

如何在运行时在Objective-C中查找字符串常量?

如何使用填充的常量字符串导出 C# 文件(在 Visual Studio 中)

构建字符串时Java中的无效字符常量?