跨翻译单元的字符串文字地址
在 C 和 C 语言中,程序员经常将字符串文字用于各种目的。出现一个常见问题:假设不同翻译单元中的相同字符串文字将具有相同的内存地址是否可靠?
C/C 标准
C99 C 草案标准明确未指定该主题。 C99 标准草案第 6.4.5 节指出“如果这些数组 [字符串文字] 的元素具有适当的值,则它们是否不同是未指定的。”这意味着编译器可以自由决定是否池化字符串文字。
编译器实现
实际上,不同的编译器对于字符串文字池有不同的行为。
缺乏要求的理由
C 标准中不要求对字符串文字进行池化是由于当时编译器和运行时环境的多样性。一些实现将字符串文字存储在 ROM 中,而其他实现则将它们存储在可写数据部分中。为了确保可移植性,最好不要强制执行任何特定行为。
实际注意事项
一般来说,依赖具有相同值的字符串文字是不可移植的跨翻译单元的内存地址。但是,在同一翻译单元内,行为更有可能保持一致,因为编译器对优化有更多控制。
结论
a 的内存地址字符串文字是一个实现细节,不能依赖它在翻译单元之间保持一致。重要的是要意识到这一事实并编写独立于此类实现细节的代码。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3