【发布时间】:2013-09-12 08:43:45
【问题描述】:
我很困惑 ANSI 规范中关于更改声明为 const 的变量可以通过其地址合法修改的内容。不幸的是,我无权访问 C90 规范,但指针冲突:
关键字 const 不会将变量转换为常量!带有 const 的符号 限定符仅表示该符号不能用于赋值。这使得价值 通过该符号只读;它不会阻止值被修改 其他一些方法是程序内部(甚至外部)的。它非常有用 用于限定指针参数,以表明此函数不会更改参数指向的数据,但其他函数可以。 (专家 C 编程:深度 C 秘密:Peter van der Linden)
如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为未定义。如果尝试通过使用具有非 volatile 限定类型的左值来引用使用 volatile 限定类型定义的对象,则行为未定义。 (http://flash-gordon.me.uk/ansi.c.txt)
我在 C99 规范 (n1256.pdf) 中看到了后者。
谁能澄清一下以上两种观点哪个是正确的?
编辑:Expect C Programming 实际上给出了一个示例来演示使用指针更改const 变量的能力。
【问题讨论】:
-
为什么它们不能都是真的?第一个是说 const 变量可以通过外部方式进行更改。第二个是说,据我所知,故意这样做是未定义的行为。
-
语言结构旨在防止意外误用,而不是故意误用 - 我试图在这个问题中说服人们同样的事情 - stackoverflow.com/questions/18755713/… - 大多数人似乎认为可以使用语言结构加强安全性或防止故意滥用。值得庆幸的是,该 Q 现在已被关闭,因为另一个问题的答案更合理。