指針 與 int的轉換 (warning: cast to pointer from integer of different size)
以前在32位上測試這兩個互相轉換時沒什麼問題的,今天碰到了一件事情,發現在64位機器上不儘然~
事情是這樣的:
為了測試errno與strerror這兩個東西,寫了一段程式
void testfunc()
{
char s[80];
FILE* fl = fopen("abc.txt", "rw");
FILE* fl2 = fopen("abc2.txt", "w");
if(!fl || !fl2)
{
char errorstr[10];
sprintf(errorstr, "%d", errno);
fputs(errorstr, stderr);
char *str_error = (char*)(strerror(errno));
printf("%s\n", str_error);
//fputs(strerror(errno), stderr);
return;
}
fputs("writing to abc2.txt...\n", stdout);
while(fgets(s,80,fl))
{
fputs(s,fl2);
}
}
在使用strerror函數的時候,以為它的聲明是包含在<errno.h>中,沒有include它實際所在的檔<string.h>
結果導致函數的隱式聲明:int strerror(int );跟它的實際類型相比,返回值由char*變為了int,其它都一樣。
編譯的時候出現:warning: cast to pointer from integer of different size
沒理它,繼續連結,運行,出現:Segmentation fault (core dumped)
調試的時候發現printf("%s\n", str_error);這句話出錯的,str_error的value非法的。當時很納悶兒,後來得知
是char* 與 int的轉化關係——之前出現的warnning就是說的這個。那為什麼先前用的int與char*(指標)轉化都沒問題
呢?難道本機二者的長度不一樣?寫了一個sizeof的測試程式,發現果然,int的長度為4,char*的長度為8,難怪!
為了驗證我的推斷,把這個不規則的程式在32位元機器上運行,發現運行時正常的:
$ ./a.exe
2No such file or directory
ps.本次的教訓是:某些warnning還是很有用的,該理會的還是要理會~
http://blog.sina.com.cn/s/blog_4b9eab320100regu.html
留言列表