2016-03-24 4 views
-4

Я почти уверен, что этот кусок кода дает мне бесконечный цикл (я ушел, если очень долгое время, и ничего не происходит), и я играл главную роль в этом в течение 2 дней и я не знаю, почему он продолжает цикл. Есть идеи?Бесконечные петли в C

int r = 0; 
    int H = 0; 
    int g = 0; 

    while (r < (3265920)) { 

     while (g < 79338) { 
      //printf("middle"); 
      if (!strcmp(arr1[g], Arr2[r])) { 

      strcpy(out[H], arr1[g]); 
      H++; 
     } 
      g++; 
     } 

    r++; 
    g = 0; 
} 

Q=0; 
while (Q < 79338) { 


    printf("%d: %s\n",Q, Ans[Q]); 
    Q++; 

} 

Все массивы имеют правильное распределение памяти вне основного.

static char arr2[NINE_FACT * 9][10]; 
char Ans[79339][10]; 
char arr1[79339][45]; 
+0

Правильно отступ. И используйте самоочевидные имена. У вас 3 петли. Что вы имеете в виду? Что говорит debugge? Что вы пробовали сами выяснить (кроме того, что смотрели на него). – Olaf

+0

@ J.doo Что означает это магическое число 3265920 и почему вы используете индекс за пределами массива? –

+0

@ J.doo А что такое arr2 и Arr2? –

ответ

2

Ваш внутренний цикл работает 259111560960 раз, что, скорее всего, займет много времени. Что такое H используется для? На 32-битной машине H может вызывать ошибки, потому что это переполнение. Обратите внимание, что длина слова машины, на которой вы находитесь, важна, то есть, что делает этот код на вашей машине?

printf("sizeof(int) == %zu\n", sizeof(int)); 

Я удивлен, что он работает правильно.

out[H]; //This array could be huge. 

Если это нормальный массив, и вы на 64-битной машине я бы ожидать ошибки сегментации или и это может занять некоторое время дампа ядра.

Предполагая, что 32-разрядная машина и одиночные символы в виде строк [H] потребуют 2^31 байта * 2 из-за нулевого терминатора, то есть чуть более 4 ГБ ОЗУ?

+0

Может ли тип int обрабатывать такое значение? – Joel

+0

зависит от машины @Joel – stackptr

+1

Проверяются как r, так и g перед тем, как они переполняются. Дело в том, что вы используете strcmp и strcpy почти 26 миллиардов раз. Я не знаю, что такое H "используется, но если вы находитесь на 32-битной машине, он переполняется. – Harry

0

значение r никогда не будет 3265920, если это 2 байта выделения памяти

либо изменить тип данных r to long или изменить состояние r так, что он будет находиться в диапазоне int

first u проанализировать диапазон int

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