close

指針  int的轉換 warning: cast to pointer from integer of different size

 

 

以前在32位上測試這兩個互相轉換時沒什麼問題的,今天碰到了一件事情,發現在64位機器上不儘然~

 

事情是這樣的:

為了測試errnostrerror這兩個東西,寫了一段程式

 

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_errorvalue非法的。當時很納悶兒,後來得知

char* int的轉化關係——之前出現的warnning就是說的這個。那為什麼先前用的intchar*(指標)轉化都沒問題

呢?難道本機二者的長度不一樣?寫了一個sizeof的測試程式,發現果然,int的長度為4char*的長度為8,難怪!

為了驗證我的推斷,把這個不規則的程式在32位元機器上運行,發現運行時正常的:

$ ./a.exe

2No such file or directory

ps.本次的教訓是:某些warnning還是很有用的,該理會的還是要理會~

 

http://blog.sina.com.cn/s/blog_4b9eab320100regu.html

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()