通过const限定符保护变量的数据没有用!

问题描述

|
#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。避免那样。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...