手机网站 html,做钓鱼网站软件下载,亚马逊aws wordpress,电商网站开发脑图在C语言中const类型的数据严格意义上可以修改#xff1a;
const int a1;
int*ba;
*b2;不同于C语言#xff0c;C中指针类型是要严格对应的#xff0c;对const类型的数据必须使用const类型的指针进行接收#xff0c;从而避免修改#xff1b; 但问题是c中同样支持指针的…在C语言中const类型的数据严格意义上可以修改
const int a1;
int*ba;
*b2;不同于C语言C中指针类型是要严格对应的对const类型的数据必须使用const类型的指针进行接收从而避免修改 但问题是c中同样支持指针的强制类型转换那么问题就出现了对于下面这段代码输出就会显得不正常
const int a1;
int*b(int*)a;
*b2;
couta bendl;
couta b;我们会发现对a和b它们的值不同但是对应的地址不同就好像出现了一个地址内包含两个值的情况。 回顾内存划分可以发现const类型的数据一般存储在data区而指针类型数据则通常存储在栈区实际上不同的分区存储数据的规则不同但一般不会出现相同的地址除非以下两种情况
内存映射操作系统在虚拟内存中进行地址映射时可能将不通过的存储区域映射到相同的虚拟地址。编译器优化编译器可能会对代码进行优化将某些数据放在相邻的内存地址包括不同存储区域的数据。这种优化可能导致栈上的变量和数据区的变量具有相同的地址。
如果说虚拟地址不是全局唯一的话就可以推测是对const强制类型转换后改变值的行为是未定义的编译器进行了优化在栈区重新开辟了一段地址用于进行修改所以就出现了两个不同的变量拥有相同地址的情况。
有不同想法欢迎探讨