强制转换const类型指针
2015-04-03 09:32
253 查看
原题来自阿里笔试,代码如下:
调试发现&val与p相同,但值却不同,很奇怪,反汇编代码如下:
可以发现在使用val时,并不是从内存中取对应位置的值而是直接用立即数,而*p则使用最开始给val分配的内存。推测编译器会把所有常量做替换(类似宏替换),但仍然保留了const类型变量的内存。
#include <cstdio> int main() { const int val = 9; int *p = (int *)&val; *p = 10; printf("%d ", val); // 输出为9 printf("%d", *p); // 输出为10 return 0; }
调试发现&val与p相同,但值却不同,很奇怪,反汇编代码如下:
0x00401334 push %ebp 0x00401335 mov %esp,%ebp 0x00401337 and $0xfffffff0,%esp 0x0040133A sub $0x20,%esp 0x0040133D call 0x401940 <__main> 0x00401342 movl $0x9,0x18(%esp) // const int val = 9; 0x0040134A lea 0x18(%esp),%eax // int *p = (int *)&val; 0x0040134E mov %eax,0x1c(%esp) 0x00401352 mov 0x1c(%esp),%eax // *p = 10; 0x00401356 movl $0xa,(%eax) 0x0040135C movl $0x9,0x4(%esp) // printf("%d", val); 0x00401364 movl $0x408024,(%esp) 0x0040136B call 0x4069ec <printf(char const*, ...)> 0x00401370 mov 0x1c(%esp),%eax // printf("%d", *p); 0x00401374 mov (%eax),%eax 0x00401376 mov %eax,0x4(%esp) 0x0040137A movl $0x408028,(%esp) 0x00401381 call 0x4069ec <printf(char const*, ...)> 0x00401386 mov $0x0,%eax 0x0040138B leave 0x0040138C ret
可以发现在使用val时,并不是从内存中取对应位置的值而是直接用立即数,而*p则使用最开始给val分配的内存。推测编译器会把所有常量做替换(类似宏替换),但仍然保留了const类型变量的内存。
相关文章推荐
- 关于c++ 强制转换类型运算符 static_cast、dynamic_cast、reinterpret_和const_cast
- 强制指针类型转换
- 指针类型强制转换
- C++ 四种类型强制转换 static_cast、const_cast、reinterpret_cast、dynamic_cast
- 细节问题系列之指针类型强制转换
- C++强制转换不同声明或类型的函数指针隐患
- 指针类型强制转换
- 指针类型之间的强制转换
- C语言中不同类型的结构体的指针间可以强制转换
- 关于指针强制类型转换的思考
- 标准c++中主要有四种强制转换类型运算符 const_cast,reinterpret_cast,static_cast,dynamic_cast
- C++在多重继承下的指针类型强制类型转换的一些问题
- C函数,函数指针,函数类型,函数数组,函数强制转换使用
- 利用指针进行类型强制转换(c指针详解)
- const类型强制转换之谜
- 强制转换指针类型
- C++强制转换不同声明或类型的函数指针隐患
- C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
- 标准c++中四种强制转换类型运算符介绍 const_cast,reinterpret_cast,static_cast,dynamic_cast
- 关于函数指针类型强制转换的一些摸索