跨翻译单元的字符串文字地址
在 C 和 C 语言中,程序员经常将字符串文字用于各种目的。出现一个常见问题:假设不同翻译单元中的相同字符串文字将具有相同的内存地址是否可靠?
C/C 标准
C99 C 草案标准明确未指定该主题。 C99 标准草案第 6.4.5 节指出“如果这些数组 [字符串文字] 的元素具有适当的值,则它们是否不同是未指定的。”这意味着编译器可以自由决定是否对字符串文字进行池化。
编译器实现
实际上,不同的编译器对于字符串文字池有不同的行为。
缺乏要求的理由
缺乏要求的理由
C 标准中不要求对字符串文字进行池化是由于当时编译器和运行时环境的多样性。一些实现将字符串文字存储在 ROM 中,而其他实现则将它们存储在可写数据部分中。为了确保可移植性,最好不要强制执行任何特定行为。
实际考虑因素
一般来说,依赖具有相同值的字符串文字是不可移植的跨翻译单元的内存地址。然而,在同一个翻译单元内,行为更有可能保持一致,因为编译器对优化有更多的控制权。
结论
a 的内存地址字符串文字是一个实现细节,不能依赖它在翻译单元之间保持一致。重要的是要意识到这一事实并编写独立于此类实现细节的代码。以上是字符串文字的内存地址在 C 和 C 语言的翻译单元中是否一致?的详细内容。更多信息请关注PHP中文网其他相关文章!