c语言const、volatile问题小结
之前百度面试的时候被volatile虐了,内核中很多地方也会用到,这个面试的时候出现概率太大了,所以搜集了一些结果供大家参考,大部分是百度到的,说得挺明确的,以后读代码的时候遇到了再更新。 百度知道有人提如下问题: #include "stdio.h" int main(void){ const char i = 1; char * j = (char *)&i; printf("%d,%d,%p,%p\n",i,*j,&i,j);//1,1 *j = 2; printf("%d,%d,%p,%p\n",i,*j,&i,j);//1,2 *j = 3; printf("%d,%d,%p,%p\n",i,*j,&i,j);//1,3 } 为什么i没有改变呢,各位运行也会发现,他们的地址都是一样的。 醉了,我debug的时候,i也是随着j改变的,但是输出时,i就变成1了。希望各位能够从编译的角度上说一下这个问题。 我对答案有稍微修改,对比vc编译结果差不多所以就引用别人的图了 1.这是有const修饰与无const修饰的汇编代码 变量i存储在eax寄存器中,有const修改表达寄存器的值不允许被修改 第22行的时候,对*j=2;赋值时,有const修饰的会对edx进行操作 而没有const进行修饰的就是直接对eax进行操作. 至于编译器调试模式下 , 看见的 i 的值变成 2,