2016-10-04 3 views
0

ich ganz von verwirrt bin, warum meine Variable NumberOfArrays ändert das zweite Mal durch die for Schleife in meinem Code. Kann mir jemand helfen?-Code ein Array-Element zu ändern, ändert sich eine andere Variable

#include <stdio.h> 
#include <cs50.h> 

int main(int argc, string argv[]) 

{ 
//variable declarations 
int NumberOfArrays = 0; 
int arrayRack[0]; 

//Get number of arrays 
printf("Key in the number of arrays you'd like to have\n"); 
NumberOfArrays = GetInt(); 



//Get number for each element in arrayRack[] 
for(int i = 0; i < NumberOfArrays; i++) 
    { 
     printf("give me an int for the %i th array\n", i + 1); 
     arrayRack[i] = GetInt(); 
     // *** on the second pass, my "NumberOfArrays" gets adjusted to my GetInt number here. Why? 
    } 


//print out numbers stored in respective arrays 
for(int j = 0; j < NumberOfArrays; j++) 
    { 
     printf("{%i}<-- number in %ith array\n", arrayRack[j], j + 1); 
    } 

    return 0; 

} 
+1

Können wir alle nur zu schätzen, wie dies ein _actual_ Stack-Überlauf auf ** Stack-Überlauf **? – Charles

+0

für die einfache Lesbarkeit und Verständlichkeit: 1) bitte den Code konsequent einrücken. Nach jeder öffnenden Klammer '{' einrücken. vor jeder schließenden Klammer '}' einrücken. – user3629249

+0

Der Compiler wird eine Anzahl von Warnungen bezüglich des geposteten Codes ausgeben. Unter diesen Warnungen. Warnung: unbenutzter Parameter 'argc' Warnung: unbenutzter Parameter: 'argv'. Wenn Parameter nicht in main() verwendet werden, können Sie den Prototyp: 'int main (void)' für andere Funktionen verwenden, folgen Sie der Funktionssignatur durch eine Anweisung ähnlich wie: '(void) parmName;' – user3629249

Antwort

4

Da erklären Sie arrayRack als leeres Array ([0]). Versuchen Sie int arrayRack[100]; oder eine andere Zahl, und stellen Sie sicher, dass NumberOfArrays weniger als diese Zahl, bevor Sie es benutzen.

Erklärung: (bearbeiten beachten Sie, dass dies je nach Compiler variieren kann) Ihre Variablen werden höchstwahrscheinlich auf dem Stapel in nahegelegenen Speicheradressen gespeichert. So arrayRack Punkte irgendwo in der Nähe von NumberOfArrays im Speicher. C überprüft im Allgemeinen nicht, ob das Ende eines Arrays abgelaufen ist, daher verursacht der Zugriff auf arrayRack[1] in dieser Situation keinen Compilerfehler. Allerdings ist arrayRack[1] nicht Teil Ihres Array, so in dieser Situation etwas anderes — es tatsächlich greift Zugriff auf NumberOfArrays.

Bearbeiten gcc erlaubt length-0-Arrays, reserviert aber keinen Platz für sie per this. Arrays der Länge 0 sind jedoch durch den C-Standard verboten (siehe z. B. this, die Antworten auf this und this). In Anbetracht des Verhaltens Sie gesehen haben, sieht es für mich wie der Compiler ist die Zuteilung einer int ‚s im Wert von Raum auf dem Stapel, zeigt arrayRack zu diesem Raum, und die Verpackung, dass der Raum direkt neben NumberOfArrays. Als Ergebnis &(arrayRack[1]) == &NumberOfArrays. In jedem Fall ist die Verwendung von Arrays variabler Länge, wie von @dasblinkenlight vorgeschlagen, ein saubererer Weg, um mit dieser Situation umzugehen.

Im Allgemeinen können Sie unter int arrayRack[N]; nur sicher auf arrayRack[0] über arrayRack[N-1] zugreifen.

3

Sie erklärt zu früh das Array. Bewegen, um die Erklärung zu nach dem Aufruf von GetInt(), wie folgt aus:

printf("Key in the number of arrays you'd like to have\n"); 
int NumberOfArrays = GetInt(); 
int arrayRack[NumberOfArrays]; 

Anmerkung:NumberOfArrays ist keine ideale Namen für die Variable, da es die Anzahl der Array-Elemente bezeichnet, nicht die Anzahl von Arrays; Ihr Code hat nur ein Array.

+0

Ich bin ziemlich sicher, dass Sie 'int arrayRack [NumberOfArrays]' in C nicht tun können. Oder zumindest wird es eine Warnung auslösen ... Ein richtiger Weg, imho, ist es, den Standard 'malloc' zu tun und 'frei'. – Charles

+2

@ c650 VLAs dürfen ab C99 beginnen. – dasblinkenlight

+0

OK.Ich war mir nicht sicher. Vielen Dank. – Charles

Verwandte Themen