2017-02-09 8 views
-1

マイコードプログラムがクラッシュ - セグメンテーションフォールト

int i,v,o,p,j; 
v=0; 
o=0; 
char x[12]={'#','v','v','o','#','o','v','#','v','o','o','#'}; 
void vukovi (char a[]) 
{ 
    for (i=0;i<12;i++){ 
     if (x[i]=='#'){ 
      for (j=i+1;x[j]!='#';j++){ 
       if (x[j]=='v'){ 
        v=v+1; 
       } 
       if (x[j]=='o') 
        o=o+1; 
      } 

      if (v>=o){ 
       for (j=i+1;x[j]!='#';j++){ 
        if (x[j]=='o'){ 
         x[j]='.'; 
        } 
       } 
      } 

     } 
     v=0; 
     o=0; 
    } 

for (i=0;i<12;i++){ 
    printf("%c",x[i]); 
    } 
} 
vukovi(x); 
return 0;} 

時にはそれがうまく印刷されます。
は時々

.exeのは、私がなぜ分からない

動作を停止し、エラー。プログラムの
アイデアは次のとおりです。どこでも2 #間のどこ私はそれがうまく印刷し、印刷したときに言ったようにo.
に置き換える必要があり、>ovです。
それ以外のエラー。助けて ?
(私はインクルードとメイン機能を省いています)。このループが間違っているi==11

+5

[タイトル翻訳](https://en.wikipedia.org/wiki/Undefined_behavior) – LPs

+0

通常のリフレイン - デバッガがあなたに何を言うのでしょうか? – KevinDTimm

答えて

5

for (j=i+1;x[j]!='#';j++){ 

それはあなたのループ以来、森の中に前方jあなたは文字列の外側すでに12時スタート、しかし、事前になりますので、は#上で停止:未定義の動作を。

割り当てられていないメモリを通過中に発生する可能性があります(発生する可能性があります)またはシステムが不正な読み取りを検出してSEGVで停止する境界を超えると、停止します。あなたが直面している何

+0

私は見る... ty –

+1

初期化子は個々の文字であるため、ヌル終端文字はありません。 –

+0

@PaulOgilvie:もちろん!私は思ったよりも森が近い(半球に応じて森や茂み)。 –

0

Segmentation Faultです。
あなたは、あなたが想定していないメモリにアクセスしています。

あなたのコードのこの部分:

for (i=0;i<12;i++){   //Till i<12, that means when i = 11 loop will run. 
     if (x[i]=='#'){ 
      for (j=i+1;x[j]!='#';j++){ //j = i+1, for i = 11, j = 12 
       if (x[j]=='v'){   
        v=v+1; 
       } 
       if (x[j]=='o') 
        o=o+1; 
      } 

      if (v>=o){ 
      for (j=i+1;x[j]!='#';j++){ //j = i+1, for i = 11, j = 12 
       if (x[j]=='o'){   //x[j] , for j = 12 , x[12] 
       x[j]='.'; //x[12] = '.' You Are Accessing Memory You Are Not Supposed to. 
        } 
       } 
      } 

あなたがバウンド外の配列にアクセスべきではありませんが、それは多くのリスクがあります。
この質問を参照してくださいHow dangerous is it to access an array out of bounds?、私はそれを強くお勧めします。

関連する問題