是否可以更改用const限定符分配的变量的值

时间:2019-06-09 17:39:36

标签: c pointers const

我无法理解为什么以下代码没有引发错误。

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

int main() 
{ 
    const int var = 10; 
    int * ptr = &var;

    printf("%p\n",ptr);
    printf("%d\n",*ptr);
    printf("%d\n",var);

    *ptr = 20;

    printf("%p\n",ptr);
    printf("%d\n",*ptr);
    printf("%d\n",var);
    return 0; 
}

据我所知,用const限定符声明的变量以只读模式存储,所以我怎么能用指针更改它。如果我错了,请纠正我。我在codechef在线编译器中运行了代码

请向我建议一种方法,即使使用变量指针也不能更改它的值。

1 个答案:

答案 0 :(得分:1)

这就是C的工作方式。

  

据我所知,用const限定符声明的变量以只读模式存储

将变量声明为常量只会阻止您通过该变量对其进行修改。没有什么可以阻止您通过指向非常量的指针(指向该变量)对其进行修改的。

  

请向我建议一种方法,即使使用变量指针也不能更改它的值。

很抱歉,但是答案是选择另一种语言。如果要编写C代码,则必须经常处理此类问题。

要做的一件事是改为声明一个指向const的指针。您可以将int * ptr = &var更改为const int * ptr = &var。这样就不可能通过var 来修改ptr 中的值,但这与C语言中的保护作用差不多。您永远不能对数据本身进行写保护。您只能确保禁止访问矢量(我自己没有一个更好的术语)更改数据。

您也可以使用#define。它有优点也有缺点,但确实可以做到。

使数据修改变得更加困难(但并非不可能)的另一件事是隐藏数据结构。您可以在this question

中看到一个示例

一种非常古怪且肯定不推荐的方法是使用字符串文字。这是一个示例:

const uint32_t const * ptr = (uint32_t*)"\x00\x01\x00\x00";

这将为您提供一个“常数”,其值为256。至少在我的机器上。我怀疑您将必须知道您的计算机是大字节序还是小字节序。它具有三种不同的保护。您不能使该指针指向其他任何对象,也不能使用指针更改其指向的对象,并且数据可能在只读存储器中可能。编译器通常通常将字符串文字放入只读存储器,但不需要这样做。我怀疑这是未定义的行为。简而言之,不要这样做。这只是为了使用相对但不是完全安全的代码可能需要在C中进行的演示。