|
|
1
40
这段代码在所有平台上都很好。字符串作为静态字符串文字被编译成二进制文件。例如,如果你在windows上,你甚至可以用记事本打开.exe并搜索字符串本身。 因为它是一个静态字符串,所以文字范围并不重要。 字符串池: 需要注意的一点是,在某些情况下,可以“合并”相同的字符串文字以节省可执行文件中的空间。在这种情况下,每个相同的字符串文字都可以具有相同的内存地址。但是,你永远不应该假设情况会或不会是这样。 在大多数编译器中,您可以设置是否对sting文字使用静态字符串池。 字符串文字的最大大小: 几个编译器对字符串文字有最大大小限制。例如,在VC++中,这大约是2048个字节。 修改字符串文字会产生未定义的行为: 永远不应该修改字符串文字。它具有未定义的行为。
宽字符串文字: 以上所有内容同样适用于宽字符串文字。 示例:L“这是一个宽字符串文字”; C++标准规定: (第lex.string节)
|
|
|
2
9
我给你举个例子,这样你的困惑就有点清楚了
这行不通。 但是
这行得通。
原因:
|
|
|
3
5
正如其他人所解释的那样,这在C(或C++)中是有效的。 我可以想到要注意的一件事是,如果你使用dll,那么如果卸载了包含此代码的dll,指针将不再有效。 C(或C++)标准不理解或考虑在运行时加载和卸载代码,因此任何这样做的事情都将面临实现定义的后果:在这种情况下,后果是字符串文字(应该具有静态存储持续时间)从调用代码的POV中出现,不会在程序的整个持续时间内持续存在。 |
|
|
4
3
是的,那很好。它们生活在一个全局字符串表中。 |
|
|
5
3
不,字符串文字没有作用域,因此您的代码可以保证在所有平台和编译器上工作。它们存储在程序的二进制映像中,因此您始终可以访问它们。然而,试图给他们写信(通过扔掉
|
|
|
6
0
您实际上返回了一个指向可执行文件数据部分中存储的以零结尾的字符串的指针,该区域是在加载程序时加载的。只是避免尝试更改字符,这可能会产生不可预测的结果。.. |
|
|
7
0
注意Brian提到的未定义结果非常重要。由于您已将函数声明为返回const char*类型,因此应该没问题,但在许多平台上,字符串文字被放置在可执行文件中的只读段(通常是文本段)中,修改它们将在大多数平台上导致访问违规。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 11 月前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 11 月前 |
|
|
Bobby · 复合字面值总是左值吗? 12 月前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 12 月前 |