2017-02-09 3 views
-1

Мой кодСбои программы - Сегментация Fault

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 перестал работать

Я понятия не имею, почему.
Идея программы: везде между двумя # где v>o, o должен быть заменен .
Как я уже сказал, когда он печатает, печатает хорошо.
Иначе ошибка. Помогите ?
(У меня нет функции включения и основной функции).

+5

[Перевод текста] (https://en.wikipedia.org/wiki/Undefined_behavior) – LPs

+0

Обычный рефрен - что говорит вам ваш отладчик? – KevinDTimm

ответ

5

когда i==11 этот цикл является неправильным:

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

, так как это делает j старт в 12 вы уже вне строки, но продвижение вперед в лесу с момента вашего цикла останавливается на #: неопределенное поведение.

Он останавливается, если вы сталкиваетесь с символом #, проходя через нераспределенную память (может случиться или нет), или когда вы сталкиваетесь с границей страницы, превышающей то, что система обнаруживает незаконное чтение и останавливается с помощью SEGV.

+0

i see i see ... 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?, я очень рекомендую его.

Смежные вопросы