2016-03-24 8 views
-4

Ich bin ziemlich sicher, dass dieses Stück Code mir eine Endlosschleife gibt (ich bin gegangen, wenn für eine sehr lange Zeit und nichts passiert), und ich habe das seit 2 Tagen gespielt und ich habe keine Ahnung, warum es Loopings macht. Irgendwelche Ideen?Unendliche Loops in 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++; 

} 

Alle Arrays haben die richtige Speicherzuordnung außerhalb der Hauptspeicher.

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

Richtig einrücken. Und verwende selbsterklärende Namen. Du hast 3 Schleifen. Welches meinst du? Was sagt der Debugge? Was hast du selbst versucht herauszufinden (außer es zu starren). – Olaf

+0

@ J.doo Was bedeutet diese magische Zahl 3265920 und warum verwenden Sie index jenseits des Arrays? –

+0

@ J.doo Und was sind arr2 und Arr2? –

Antwort

2

Ihre innere Schleife läuft 259111560960 mal die eine lange Zeit wahrscheinlich stattfinden wird. Was ist H wird für verwendet? Auf einer 32-Bit-Maschine H könnte Fehler verursachen, weil es überläuft. Beachten Sie, dass die Wortlänge der Maschine, auf der Sie sich befinden, wichtig ist, dh was produziert dieser Code auf Ihrer Maschine?

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

Ich bin überrascht, dass es richtig läuft.

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

Wenn dies ein normales Array ist, und Sie sind auf einer 64-Bit-Maschine, die ich einen Segmentation Fault erwarten würde, oder, und dies kann manchmal einige Zeit einen Core Dump nehmen.

Angenommen, ein 32-Bit-Rechner und einzelne Zeichen als Strings out [H] benötigen 2^31 Bytes * 2 wegen null Terminator dh nur über 4 GB RAM?

+0

Kann der Int-Typ mit einem solchen Wert umgehen? – Joel

+0

hängt von der Maschine ab @Joel – stackptr

+1

beide r und g werden getestet, bevor sie überlaufen würden. Der Punkt ist, dass Sie strcmp und strcpy fast 26 Milliarden Mal ausführen. Ich weiß nicht, was "H msgstr "0" – Harry

0

Wert von r wird nie 3.265.920 zu gehen, wenn es 2 Byte Speicherzuweisung ist

Sie entweder den Datentyp r to long oder ändern im Bereich von int

wird den Zustand der r so ändern, dass es

Zuerst analysieren Sie den Bereich von int