2012-12-20 58 views
-11
char c,s[4]; 
    int i=1000; 

    while(1) 
    { 

     i+=10; 

     sprintf(s,"%d",i); 
      printf("%s",s); 
    } 

當我編譯上面的代碼我得到的輸出如下:它爲什麼這樣工作?

1010 778 788 798 808 818... 

有誰能夠解釋我爲什麼這個kolavery d?

+3

由於此代碼根本不會生成輸出,因此它不能是您使用的代碼。向我們展示真實的代碼。 – glglgl

+0

什麼是InitUart0?我想你在那裏搞砸了。 – nhahtdh

+0

這是幹什麼的? InitUart0(); ?這個kolavery是什麼?你在哪裏重置你的我? – ryadavilli

回答

5

sprintf()正在將五個字符(四位數和NUL)寫入四字符緩衝區。因此你有一個緩衝區溢出,並且你的代碼的行爲是不確定的。

如果您對778來自哪裏感興趣,請考慮以下內容:(1010 & ~0xff) + 10 = 778

由於即使對編譯器選項的最小修改(更不用說對工具鏈進行更大的修改)也可能使undefined behaviour以其他方式體現出來,所以您不能強調這一點。

+0

是的,我知道它的緩衝區溢出,但是每次我編譯時778是如何出現的。這意味着它定義的行爲..!見輸出:1010 778 788 798 808 818 828 838 848 858 868 878 888 898 908 918 928 938 948 958 968 978 988 998 1008 778 788 798 808 818 828 838 848 858 868 878 888 898 908 918 928 938 948 958 968 978 988 998 1008 778 – Amar

+5

@Amar:這當然不*意味着。 – NPE

+0

那麼,這是什麼意思? – Amar

1

您的數組s [4]不夠大,無法打印4位整數,因此會覆蓋其他局部變量,從而破壞'i'。