您的位置:首页 > 编程语言 > C语言/C++

强制转换const类型指针

2015-04-03 09:32 253 查看
原题来自阿里笔试,代码如下:

#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类型变量的内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息