https://blog.csdn.net/liuchunjie11/article/details/80333224
在查看上述博客时,修改代码
#include <stdio.h>
const int g_cc = 4;
int main()
{
const int cc = 0x01;
int* p = (int*)&cc;
int* p = NULL;
*p = (int*)&cc; //不能运行,编译器提示把int * 赋值给int是错误的,*p回一个int类型的值
p = (int*)&cc; //可以运行,(int*)的意思应该理解为:p是一个二级指针,
p = &cc; //可以运行,结果同上
*p = cc ; //可以运行,结果同上
printf("cc = %d *p = 0x%x\n",cc,*p);
//cc = 2; //编译通过,运行错误,因为cc被定义成const局部变量,不能出现在赋值符号左边,运行时导致程序段错误
*p = 3; //编译和运行都通过,因为cc是局部变量,所以不管是ANSI还是现代GCC编译器都可以更改,同时也说明了用const修饰变量只是说明这个变量不能出现在赋值符号的左边,但是依然可以更改,但是假如如果cc是全局变量,那就不一定了,如果是ANSI编译器是可以更改的(你可以用BCC编译器试下,BCC就是早期的ANSI编译器)因为早期编译器把const修饰的变量还是存储在全局数据区可以更改,如果是现在的VC或者GCC编译器是不可以更改的,因为现代编译器把const修饰的全局变量存储在全局只读存储区中,更改会出错
printf("cc = %d *p = %d\n",cc,*p);
p = (int*)&g_cc;
printf("g_cc = %d *p = %d\n",g_cc,*p);
//*p = 5; //编译通过,运行错误,因为g_cc被定义成const全局变量,又因为GCC属于现代编译器所以g_cc被分配到全局只读存储区,不能更改,更改导致段错误
//printf("g_cc = %d *p = %d\n",g_cc,*p);
return 0;
}

3万+

被折叠的 条评论
为什么被折叠?



