问题描述
|
#include<stdio.h>
int main()
{
const char const_cvar1 = \'X\';
const char* ptr_to_const_char = &const_cvar1;
// Simply a typecast of \"ptr to a const char\" to a \"ptr to char\" disables security !!!
*(char *)ptr_to_const_char = \'S\';
printf(\"\\n Value of const char changed from X to : %c \\n\",const_cvar1);
return 0;
}
输出:-
const char的值从X更改为:S
我想知道我们是否永远不能依赖C中的const限定符?是事实吗?
解决方法
它是C。您可以做很多愚蠢的事情,导致不确定的行为,依赖于编译器/平台等。
抛弃const修饰符就是其中之一。您可以这样做,但是无法保证结果。
您甚至可以将其投放到几乎所有内容,风险自负。
*(float *)ptr_to_const_char = 2.18;
但是,const不是没有用的。
它提供了文档,程序员阅读了将指针声明为const的代码。
可以假设他可以/不应该修改指针指向的内容
它可以使编译器进行进一步的优化
只要记住C不会保护您免受自己或他人的侵害,它还使您能够不遵守类型系统。
,确实是事实。实际上,编译器在看到您抛弃const
时就关闭了const优化(几乎没有),将其像其他变量一样对待。
,const
不保护变量。实际上,const
甚至不表示变量永远不会改变。
这意味着您(程序员)声明您将不会写入那部分内存。微芯片上的存储器映射的仅输入引脚可能由合格的变量“ 2”表示,但是如果引脚上的电压发生变化,它仍然可以更改。 (实际上,它很可能会被声明为const volatile
,这是我第一次看到它时就感到震惊。)但是const
表示您不允许写它。
因此,如果您违背了诺言-您无意写信给诺言,那么是的,当然,这会使事情搞砸了。
,您正在使用C进行编程,而C总是这样。在玩指针时,您需要始终小心。
,我相信你想要
char * const ptr_to_const_char
这是一个常量指针,而不是指向常量的指针。
但这可能仅适用于C ++。
,用这种方法修改定义为const的变量的内容显然是UB。避免那样。