**代碼:**
~~~
#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](http://blog.csdn.net/zhanxinhang)>
代碼疑云系列的其它篇:[代碼疑云,等你來解](http://blog.csdn.net/zhanxinhang/article/details/6626848 "[置頂]代碼疑云,等你來解")