keil51下使用sprintf死機問題

原文鏈接:https://www.cnblogs.com/shirishiqi/p/5556469.html

 

轉載自:https://www.cnblogs.com/shirishiqi/p/5556469.html

測試環境:keil c51 + STC89C52
說明:

1.keil的不定參數只有15個字節
也就是說sizeof(...) 加起來總共不能超過15字節,否則會出錯

2.當不定參數中有常數時,你也會得不到你想要的結果,字符串除外

例:
 unsigned char count_sec=2, count_min=3, count_hour=4;
 xdata char buf[12] = "";
 sprintf(buf, "%2d:%2d:%2d", count_hour, count_min, count_sec);
則轉換完的結果是不正確的。
解決方式1:
unsigned char count_sec=2, count_min=3, count_hour=4;
改成:
unsigned int count_sec=2, count_min=3, count_hour=4;
相同的代碼在VC6.0下卻是正常,爲何?
printf("%d\n",12);
printf("%d\n",1234);
/****************KEIL C51**************************/
143: printf("%d\n",12); 
C:0x098D 7BFF MOV R3,#0xFF
C:0x098F 7A0A MOV R2,#0x0A
C:0x0991 7902 MOV R1,#0x02
C:0x0993 75390C MOV 0x39,#0x0C
C:0x0996 12057D LCALL PRINTF(C:057D)
144: printf("%d\n",1234); 
C:0x0999 7BFF MOV R3,#0xFF
C:0x099B 7A0A MOV R2,#0x0A
C:0x099D 7902 MOV R1,#0x02
C:0x099F 753904 MOV 0x39,#0x04
C:0x09A2 753AD2 MOV 0x3A,#0xD2
C:0x09A5 12057D LCALL PRINTF(C:057D)

/******************VC++6.0***************************/
155: printf("%d\n",12);
00401628 push 0Ch
0040162A push offset string "%d\n" (00426034)
0040162F call printf (00411040)
00401634 add esp,8
156: printf("%d\n",1234);
00401637 push 4D2h
0040163C push offset string "%d\n" (00426034)
00401641 call printf (00411040)
00401646 add esp,8
/*************************************************/

這個時候你會發現,爲什麼keil c51會錯了,因爲它沒有內存對齊
輸入常數12的時候,佔一個字節,他就給你分配一個字節,輸入1234的時候佔2個字節
他就給你分配兩個字節
而VC++6.0就不一樣了,你輸入的常數起碼都給分配4個字節,所以在你取數據的時候,
取四個字節就不會錯了,keil呢,該取幾個呢?不知道?所以數據會出錯

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章