2014-11-01 81 views
0

我只是想運行一個簡單的程序來計算空格,數字和其他字符數使用數組的數量。下面是我的程序:分段錯誤&打印一個沒有循環的數組

void main(){ 


    int digit_holders[10]={0}; 
    int ch; 
    int i, white_space=0,other=0; 

    while((ch=getchar())!=EOF){ 

      if(isspace(ch)) 
        white_space++; 
      else if(isdigit(ch)) 
        digit_holders[ch-'0']++; 
      else 
        other++; 
    } 
    digit_holders[12]=20; 
    printf("\n White spaces=%d\n Other=%d\n",white_space,other); 
    for(i=0;i<=9;i++) 
      printf("\ndigit_holders[%d]=%d\n",i,digit_holders[i]); 
    printf("\n digit_holder[12]=%d\n",digit_holders[12]); 
} 

2個問題:

  1. 爲什麼digit_holders [12]仍設法打印儘管它是範圍之外的分配淡水河谷?爲什麼它不顯示分段錯誤?當我將for循環檢查更改爲= 11它管理打印digit_holders [11] = 0(它不應該)時,會發生同樣的情況。但是,當我將11/10與1100即數字持有人[1100]在任何情況下,程序崩潰(分段故障)。爲什麼這樣 ?
  2. 有沒有更簡單的方法來打印這個數組的元素而不使用for循環?

- 謝謝!

+0

輕鬆地在Python中打印出一串字符串,不需要,您需要一個循環來打印C中的數組內容。您正在分配的數組的第12個元素僅聲明瞭10個元素,它有風險做和不穩定,但不一定會導致seg故障,因爲如果操作系統在寫入和讀取之間的時間內沒有修改它你的指針將毫無錯誤地解析這個值。但是,風險很大。 – 2014-11-01 11:08:01

回答

1

在C中沒有範圍檢查,所以它是最好的拍攝(即足夠的繩索掛上自己和家人的其他人)。

操作系統發生分割錯誤。即嘗試訪問未分配給進程的內存。

1

正如我在評論中寫道:

您將需要某種形式的循環打印您陣列的內容C.

你只有10個元素分配一個數組的第13個元素聲明,它有風險做和不穩定,但不一定會導致seg錯誤,因爲如果OS在寫入和讀取之間沒有修改它,你的指針將毫無錯誤地解析值。但是,風險很大。

如果您已經聲明瞭一個包含13個元素的數組,所有13個元素將被保留在內存中,並且不會出現seg錯誤。如果您詢問超出其聲明範圍的數組,您可能會遇到seg故障,而且越遠離您定義的範圍。

0

可以在C中打印「超出範圍」的數組索引,因爲digit_holders[12]的處理方式與digit_holders是一個指針,其偏移量爲12 * sizeof(int)添加到它上面。

這不一定會導致分段錯誤,因爲正在讀取的內存地址仍可能被指定爲「可用」程序。這方面的一個很好的例子是包含數組的struct

typedef struct { 
    int some_array[12]; 
    int another_int; 
} my_struct; 

如果你讀的some_array[12]的價值,你會得到的another_int內容,而不是,因爲它是最後一個「有效」索引之後直接存儲some_array

至於數組的打印:我不知道有什麼方法可以在不使用C語言中的循環的情況下打印出數組,儘管它在其他一些語言中是可行的。例如,您可以使用print(", ".join(["This", "That", "The other"]))