Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567372
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:29:46

现象、问题描述
int array[5], i , *ip;
for (i = 0; i < 5; i++)  array[i] = i;
ip = array;
printf ("%d\n", *(ip + 3 * sizeof (int)));
打印结果将是不可预期的值。
关键过程、根本原因分析
在C语言中,指针总是按照它所指向的对象的大小步进。在上面的例子中,ip是指向整数类型变量的指针,一个整数是4个字节(默认CPU字长是32位),ip + 1就指向下一个整数,也就是指针后移4个字节,而不是说将地址只移动一个字节。因为C语言编译器知道每个指针的类型,因此对指针的运算是会自动把所指类型的尺寸考虑进去的。
结论、解决方案及效果
编译器挺聪明的,我们就不用象上面的例子那样多此一举了!
ip + 3 * sizeof (int) = ip + 3 * 4 = ip + 12 ,因此ip指向了数组的第13个整数元素。而数组本身才5个元素,ip已经超出了界限,所指向的地方当然是垃圾内容了。
经验总结、预防措施和规范建议
C语言编译器知道每个指针的类型,因此对指针的运算是会自动把所指类型的尺寸考虑进去的。我们不要多此一举。
备注

考核点
指针运算
试题
int array[10], i , *ip;
for (i = 0; i < 10; i++)  array[i] = i;
ip = array;
printf ("%d\n", *(ip + 2 * sizeof (short)));
注:机器字长是4
打印结果是(C)
A:1
B:2
C:4
D:8
阅读(381) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~