代码疑云(11)——指针与类型转换


代码

#include <stdio.h>
#include <stdlib.h>
void swap(int  *pa, int *pb)
{
	int temp;
	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

int main()
{
  char a[]="BACD";  //a字符串数组
 

  swap((int*)&a[0],(int*)&a[1]);//经过强制转换后交换a和b的值,使原序列变为“ABCD”


  printf("after swap:\n");
  printf("%s",a);  //打印a字符串数组
  
  system("pause");
  return 0;
}


以上c程序调用swap函数后能否得到预期的结果?结果是?




……………………………………………………………………………………………………………………………………………………………………………………




解释:不能,在32位机中,a为char型数组,各元素占用1字节内存空间,而在swap函数声明里的pa和pb为int 型指针,也就是说编译器会把pa,pb解析为指向连续四字节空间的指针,在进行各种运算时就是对pa、pb所指向的四字节进行运算,那么以上程序的pa、pb指向哪里呢?通过打印它们发现pa和pb的地址相差为1,pa小于pb,因为pa,pb对应a数组的地址所以实际上pa所指的四个字节是a数组下标第0,1,2,3的四个元素,而pb指向a数组下标为1,2,3,4的四个元素。图示:


pa对应a数组编号:       0        1        2      3

pa所指内存空间: | ‘B’ | ‘A’ | 'C' | 'D' |


pb对应a数组编号:      1        2        3      4

pb所指内存空间: | ’A‘ | 'C' | 'D' |'\0' |

所以在swap里,首先temp存储了*pa为[B,A,C,D],执行*pa=*pb后pa就变为[A,C,D,\0],此时a数组就变为[A,C,D,\0,\0], 然后执行*pb=temp,结果pb=[B,A,C,D],a数组又变为[A,B,A,C,D]。所以打印a字符串数组的最终结果是:ABACD然后后面跟着一堆乱码。

总结:强制转换指针变量类型是不明智的选择,除非你能确保转换后所指向的内存空间大小与没转换后是一样的,如果不是将会带来灾难性的后果,导致程序中其它变量被串改或由于指向了某段未经声明的内存空间而变为野指针。

< 尊重原创,转载需注明出处:http://blog.csdn.net/zhanxinhang>


代码疑云系列的其它篇代码疑云,等你来解


  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值