2013-07-02 93 views
2
#include<stdio.h> 
int main() 
{ 
    char s[2]="a"; 
    s[1]='b';s[2]='c';s[3]='d';s[5]='e'; 
    printf("%s $%c$",s,s[4]); 
    return 0; 
} 

1.當我在C(gcc-4.7.2)中運行該程序時,由於缺少空字符('\ 0'),我期望運行時錯誤。C字符串程序的輸出

2.如果程序仍然編譯並執行成功,由於s [4]沒有被初始化,所以我期望在那個地方有一些垃圾值..但這裏我也錯了。

上述程序的輸出是: abcde $$ 兩個$(dollor)之間沒有字符,表示printf跳過s [4]。 這裏是一個ideone鏈接相同: http://ideone.com/UUQxb2

解釋此行爲(輸出)的原因?

+1

你的程序應該給編譯錯誤。因爲當s僅由2個元素組成時,s [4]或s [5]不存在 –

+1

位置s [4]可能只是有一個不可打印的字符。 –

+0

@AswinMurugesh:我已經給出了問題中的ideone鏈接,它正在編譯和執行成功。 –

回答

1

您正在寫入/讀取數組邊界之外,這僅僅是undefined behavior您無法預測程序將執行什麼操作。

1

訪問數組的界限是未定義的行爲。只是一個例子相同的代碼是我的系統上的輸出爲abcd(e▒x $($

長度爲8的字符串是因爲缺乏NULL終結和$之間的字符(s[4]垃圾值。

0
  1. 發生運行時錯誤不是必需的。 C沒有綁定檢查。
  2. C中定義了許多字符,如果我記住正確的話,就像發出嗶嗶聲\a一樣,因此不需要在屏幕上實際顯示某些內容。這可能是你從未聽過的聲音。