为了账号安全,请及时绑定邮箱和手机立即绑定

c+中的字符串是在静态内存中创建的吗?

c+中的字符串是在静态内存中创建的吗?

C++
ibeautiful 2019-12-19 18:14:12
c+中的字符串是在静态内存中创建的吗?c+中的字符串是在静态内存中创建的,并且只有在程序退出时才被销毁吗?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

创建它的地方是编译器编写器的实现决定,真的。最有可能的是,字符串文本将存储在内存的只读段中,因为它们从不更改。


在过去的编译器时代,您曾经拥有像这些文字一样的静态数据,以及全局但可变的数据。这些数据存储在文本(代码)段和数据(初始化数据)段中。


即使你有这样的代码char *x = "hello";,hello字符串本身存储在只读内存中,而变量则存储在只读内存中。x在堆栈上(如果是全局的,则在可写内存中的其他地方)。x只需设置为hello绳子。这允许各种棘手的事情,如字符串折叠,以便“无效选项”(0x1000)和“有效选项”(0x1002)可以使用相同的内存块,如下所示:


+-> plus:0   1   2   3   4   5   6   7   8   9   A   B   C   D   E

|      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

0x1000 | i | n | v | a | l | i | d |   | o | p | t | i | o | n | \0 |

       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

记住,我并不是指只读存储器,而是专用于存储不可更改的东西的内存(操作系统可能会将其标记为只读)。


它们也从未被摧毁,直到main()出口。



查看完整回答
反对 回复 2019-12-20
?
倚天杖

TA贡献1828条经验 获得超3个赞

是的,字符串文本在整个程序期间都是有效的,即使在销毁静态对象的过程中也是如此。

2.13.4/1在“标准”中说

一个普通的字符串文字具有类型为“数组的n个字符”和静态存储时间。

该标准在3.7.1/1中提到“静态存储持续时间”:

这些对象的存储应在程序期间持续。



查看完整回答
反对 回复 2019-12-20
?
喵喔喔

TA贡献1735条经验 获得超5个赞

好吧.。是。它们是必须的;组成每个字符串中的字符序列的信息必须在某个地方。如果要动态分配它们,然后进行初始化,用于初始化的信息将驻留在哪里?因此,简单地使字符串保持静态是更有效的,这样一旦程序完成加载,它们就始终是可用的和有效的。



查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 330 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信