我无法理解为什么以下代码没有引发错误。
#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在线编译器中运行了代码
请向我建议一种方法,即使使用变量指针也不能更改它的值。
答案 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中进行的演示。