![]() |
1
40
这个代码适用于所有平台。该字符串作为静态字符串文本编译到二进制文件中。例如,如果您在Windows上,甚至可以用记事本打开.exe并搜索字符串本身。 因为它是一个静态字符串,所以文字范围并不重要。 字符串池: 需要注意的一点是,在某些情况下,相同的字符串文本可以“合并”以节省可执行文件中的空间。在这种情况下,相同的每个字符串文字可能具有相同的内存地址。不过,你不应该认为情况会或不会是这样。 在大多数编译器中,您可以设置是否对string文本使用静态字符串池。 字符串文本的最大大小: 几个编译器的字符串文本的大小是最大的。例如,对于VC++,这大约是2048字节。 修改字符串文字会给出未定义的行为: 永远不应该修改字符串文字。它有一个未定义的行为。
宽字符串文字: 以上所有内容都同样适用于宽字符串文本。 示例:l“这是一个宽字符串文本”; C++标准声明: (lex.string节)
|
![]() |
2
9
我给你举个例子,让你的困惑变得更加清晰
这行不通。 但是
这是可行的。 原因:“sumit”是一个具有全局范围的文本。 而数组只是一个字符序列'S'、'U'、'M'、'I'、'T''\0' 范围有限,程序一返回就消失。 希望这有帮助 |
![]() |
3
5
这在C(或C++)中是有效的,正如其他人所解释的。 我能想到的一点是,如果您使用的是DLL,那么如果卸载了包含此代码的DLL,指针将不会保持有效。 C(或C++)标准在运行时不理解或考虑加载和卸载代码,因此,任何这样的操作都将面临实现定义的后果:在这种情况下,结果是,字符串应该是静态存储持续时间,从调用代码的POV中出现,而不是为F持久化。计划的全部持续时间。 |
![]() |
4
3
是的,没关系。它们生活在一个全局字符串表中。 |
![]() |
5
3
不,字符串文本没有作用域,因此您的代码保证可以跨所有平台和编译器工作。它们存储在程序的二进制映像中,因此您可以随时访问它们。但是,尝试写信给他们(通过扔掉
|
![]() |
6
0
实际上,您返回一个指针,指向存储在可执行文件的数据段中的以零结尾的字符串,这是加载程序时加载的区域。只需避免尝试更改字符,它可能会产生不可预知的结果… |
![]() |
7
0
注意布莱恩提到的未定义的结果是非常重要的。由于您已经声明函数返回const char*类型,所以应该可以这样做,但在许多平台上,字符串文本被放置到可执行文件(通常是文本段)的只读段中,修改它们将导致大多数平台上的访问冲突。 |
![]() |
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
![]() |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Manan Girdhar · 拆分字符串并仅在java中使用第二部分 2 年前 |
![]() |
AnxiousLuna · Python使用len()获取数组索引数 2 年前 |
![]() |
antonoyaro8 · 数据帧中每列上的Grepl 2 年前 |