如果我可以通过 C 中的指针修改 const 限定符,那么它的用途是什么?

发布于 2024-10-14 16:38:46 字数 607 浏览 2 评论 0原文

可能的重复:
邪恶的编译器会打败邪恶的演员吗?

你好,

如果我可以通过指针修改一个常量,那么它的目的是什么? 下面是代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
 const int a = 10;
 int *p = (int *)&a;

 printf("Before: %d \n", a);
 *p = 2;
 /*a = 2; gives error*/

 printf("After: %d \n", *p);

 return 0;
}

输出:

之前:10
之后:2
按任意键继续。 。 。

使用 Visual Studio 2008。

Possible Duplicate:
Does the evil cast get trumped by the evil compiler?

Hello,

If I can modify a constant through a pointer, then what is the purpose of it?
Below is code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
 const int a = 10;
 int *p = (int *)&a;

 printf("Before: %d \n", a);
 *p = 2;
 /*a = 2; gives error*/

 printf("After: %d \n", *p);

 return 0;
}

OUTPUT:

Before: 10
After: 2
Press any key to continue . . .

Using Visual Studio 2008.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柠檬色的秋千 2024-10-21 16:38:46

您可以修改该值的原因是因为您进行了指针类型转换,剥离了 const 性:

int *p = (int *)&a;

此类型转换为 const int*(即 &a< /code>) 转换为 int *,允许您自由修改变量。通常编译器会警告您这一点,但显式类型转换抑制了警告。

const 背后的主要原理是为了防止您意外修改您承诺不会修改的内容。正如您所看到的,它不是神圣不可侵犯的,您可以不受惩罚地抛弃常量性,就像您可以做其他不安全的事情一样,例如将指针转换为整数,反之亦然。这个想法是你应该尽量不要搞乱const,如果你这样做,编译器会警告你。当然,添加强制转换会告诉编译器“我知道我在做什么”,因此在您的情况下,上述内容不会生成任何类型的警告。

The reason you could modify the value is because you did a pointer typecast that stripped off the constness:

int *p = (int *)&a;

This typecasts a const int* (namely &a) to an int *, allowing you to freely modify the variable. Normally the compiler would warn you about this, but the explicit typecast suppressed the warning.

The main rationale behind const at all is to prevent you from accidentally modifying something that you promised not to. It's not sacrosanct, as you've seen, and you can cast away constness with impunity, much in the same way that you can do other unsafe things like converting pointers to integers or vice-versa. The idea is that you should try your best not to mess with const, and the compiler will warn you if you do. Of course, adding in a cast tells the compiler "I know what I'm doing," and so in your case the above doesn't generate any sort of warnings.

笙痞 2024-10-21 16:38:46

如果我可以通过a修改一个常量
那么指针的目的是什么
它?下面是代码:

这是未定义的行为,应该不惜一切代价避免:

§ C99 6.7.3p5

如果尝试修改
用 const 限定的对象定义
通过使用左值进行类型
非 const 限定类型,
行为未定义

If i can modify a constant through a
pointer then what is the purpose of
it? below is code:

This is Undefined Behavior and should be avoided at all costs:

§ C99 6.7.3p5

If an attempt is made to modify an
object defined with a const-qualified
type through use of an lvalue with
non-const-qualified type, the
behavior is undefined
.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文