2016-07-02 5 views
2

Hallo ich ein sehr einfaches Programm vorgenommen habe, die funktionieren sollen, aber es nicht tun:Zwei fast genau die gleichen Programme, aber unterschiedlicher Ausgang

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

int main(int argc, char *argv[]) { 
    int usedNumbers[256]; 
    memset(usedNumbers,0,256); 

    srand(time(NULL)); 

    for(int i=0; i<256; ++i){ 
     while(1){ 
      int r = rand()%256; 
      if(!usedNumbers[r]){ 
       usedNumbers[r] = 1; 
       break; 
      } 
      printf("Test: %03d -> %03d\n", i, r); 
     } 
    } 

    return 0; 
} 

Die Idee des Programms ist es Zahlen drucken von 0 bis 255 auf der Bildschirm in der zufälligen Reihenfolge, aber das Programm stoppt auf 84. Nummer auf 32 Computern und 144. Nummer auf 64-Bit-Computern. Wenn ich nur die "int usedNumbers [256];" über der Funktion wie folgt:

#include <string.h> 

int usedNumbers[256]; 

int main(int argc, char *argv[]) { 

Programm funktioniert wie es soll. Warum ist das so? Ich verwende den neuesten GNU/GCC-Compiler und C11-Standard.

+3

'memset (usedNumbers, 0,256);' sollte 'memset sein (usedNumbers, 0, sizeof (usedNumbers));' – BLUEPIXY

+0

Die 'size' für' memset() 'ist in Bytes - weiß nicht wie groß sind Ihre Array-Elemente. – Dmitri

+0

Wenn Sie 'usedNumbers' so verschieben, dass es global wird, wird es standardmäßig auf Null gesetzt. Ihre 'memset()' setzt nur den ersten Teil (1/4 davon, mit 4-Byte 'int'). – Dmitri

Antwort

3

Die usedNumbersinnenmain ist eine lokale Variable, und diese sind nicht Null initialisiert (d.h. sie Müll enthalten kann). Da Sie nur memset(..., 256) verwenden, sind nur die ersten 256 Bytes Null initialisiert, und der Rest (z. B. die Hälfte oder drei Viertel des Arrays - oder mehr, je nach Größe von int) ist nicht.

Die usedNumbersaußerhalbmain ist eine globale Variable, aber, und diese sind völlig Null initialisiert, auch ohne memset. Sie haben also wirklich ein leeres Array, in dem kein Müll ist, und deshalb funktioniert das wie erwartet.

So tun:

memset(usedNumbers, 0, sizeof(usedNumbers)); 

und beide Versionen sollten das gleiche, erwartete Ergebnis.

+0

Vielen Dank! Ich habe das nicht bemerkt, wahrscheinlich habe ich zu viel Java in meinem Kopf. – ProNOOB

+0

Ich kann deinen Kopf nicht kommentieren. Meinst du Kaffee oder die Sprache? ;-) –

+0

Sprache, ich meinte, dass ich in Java zu viel programmiert habe und fast vergessen habe, in C zu programmieren. – ProNOOB

Verwandte Themen