通过指针修改被const指针指向的数据是否安全?编译器会优化吗?
问题解答
访问是否安全?
完全安全。int const *p的含义只是不能通过p修改它指向的变量,但不限制其他途径修改该变量。全局变量i本身是可修改的,通过指针d修改它是合法操作,之后用p读取i的当前值也完全符合C标准,不存在未定义行为。
编译器会不会优化导致*p输出42?
正常场景下绝对不会,但存在理论上的极端陷阱场景:
- 编译器要把
*p优化成初始值42,必须能100%确定*d = 43这行代码不会改动p指向的对象。在你给出的代码里,d是全局指针,明确指向i,而p也是传入的指向i的指针,编译器很容易判断出两者指向同一个变量,所以不会做这种错误优化。 - 极端情况:如果代码结构更复杂(比如存在多层函数调用、跨编译单元的指针操作),或者启用了某些极端激进的编译选项,编译器可能无法追踪到
d和p指向同一个变量,这时候才有可能错误地认为p指向的变量未被修改,从而把*p替换成初始值42。但在你当前的这段简单代码里,这种情况几乎不可能发生。
实际测试结果说明
你测试时*p输出43是完全符合预期的,因为代码确实修改了i的值,p指向的就是i,读取的自然是修改后的结果。
内容的提问来源于stack exchange,提问作者Hren Sgory
相关产品推荐
相关产品推荐

