可能重复:
邪恶的演员是否被邪恶的编译器打败了?
你好,
如果我可以通过指针修改常量,那么它的目的是什么?以下是代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
之前:10
之后:2
按任意键继续...
使用Visual Studio 2008.
该const类型限定符使编译器的情况下发出一个错误消息试图修改声明为一个对象const,但这是不够的protection.For例如以下程序修改声明为所述阵列的两个元件const:
#include <stdio.h>
int main(void)
{
const char buf[2] = { 'a','b' };
const char *const ptr = buf;
unsigned long addr = (unsigned long)ptr;
*(char *)addr = 'c';
addr = addr + 1;
*(char *)addr = 'd';
printf("%c\n", buf[0]);
printf("%c\n", buf[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,事实证明编译器没有足够的保护来保护对象不被修改.我们如何防止这种事情?
我想通过使用指针来改变常量的值.
请考虑以下代码
int main()
{
const int const_val = 10;
int *ptr_to_const = &const_val;
printf("Value of constant is %d",const_val);
*ptr_to_const = 20;
printf("Value of constant is %d",const_val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,常量的值被修改.
但是当我尝试使用全局常量的相同代码时,我遇到了运行时错误.Windows崩溃记者正在开放.在此语句"*ptr_to_const = 20;"中打印第一个printf语句后,可执行文件暂停
请考虑以下代码
const int const_val = 10;
int main()
{
int *ptr_to_const = &const_val;
printf("Value of constant is %d",const_val);
*ptr_to_const = 20;
printf("Value of constant is %d",const_val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序使用codeblocks IDE在mingw环境中编译.
谁能解释一下发生了什么?
我在代码中写了一些类似的东西
const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)
这适用于所有编译器吗?为什么GCC编译器没有注意到我们正在改变一个常量变量?
我想知道以下如何工作@编译器级别.
int const iVal = 5;
(int&)iVal = 10;
Run Code Online (Sandbox Code Playgroud)
一点m/c或编译器级别的答案会非常充实.
提前致谢.