2016-10-24 4 views
0

Ich frage mich, ob jemand mir mit dem folgenden C-Programm helfen kann, das ich mache. Der Code erstellt einfach einen Zeiger, dem dann die Adresse eines Integer-Arrays zugewiesen wird. Von dort erhält der Zeiger einen Wert und wird dann inkrementiert. Die Ausgabe zeigt den Array-Namen, die Array-Adresse und den Array-Wert an. Die Ausgabe funktioniert wie erwartet, außer dass das letzte Element im Array um 5 anstatt um eins erhöht wurde.C Programm mit Pointer Inkrementieren Falsche Werte

ist der Code unten gezeigt:

#include <stdio.h> 

main() 
{ 
    int numar[4];  //integer array 
    int x;    //value for loop 
    int *p;    //pointer 
    p=numar;   //'point' p to address of numar array (no & necessary as arrays are pointers) 
    for(x=0;x<5;x++) //loop 0-4 
    { 
     *p=x;   //assign the value of the first item in array to x 
     p++;   //increment pointer for next iteration 
    } 
    for(x=0;x<5;x++) //loop 0-4 
    { 
     //display output of array name, array location and array value 
     printf("array[%d] is at address %p with value %d\n", x,&numar[x],numar[x]); 
    } 
    return 0; 
} 

Die Ausgabe des obigen Codes ist unten gezeigt:

array[0] is at address 0061FF18 with value 0 
array[1] is at address 0061FF1C with value 1 
array[2] is at address 0061FF20 with value 2 
array[3] is at address 0061FF24 with value 3 
array[4] is at address 0061FF28 with value 8 

Da der gewünschte Wert für Array sehen kann [4] 4, sein sollte, , aber es ist stattdessen 8.

Jede Hilfe würde sehr geschätzt werden.

Vielen Dank,

+10

'int numar [4]; 'sieht aber so aus, als ob Sie auf Index 4 zugreifen (max. gültig ist 3), deshalb laufen Sie vom Ende des Arrays ab und rufen undefiniertes Verhalten auf. Hier kommen die Nasen-Dämonen .... – John3136

+1

'[4]' bedeutet, dass das Array 4 Elemente hat –

+0

Arrays sind *** nicht *** Zeiger. Ein (Unter-) Ausdruck, der zu einem Array ausgewertet wird, "verfällt" in einen Zeiger auf das erste Element dieses Arrays (und so funktioniert Ihre Zuweisung), aber das ist eine ganz andere Sache. –

Antwort

2

Um Kompilieren des Codes zu machen, hatte ich eine Änderung zu machen: Ich habe ‚int‘ vor ‚main‘, so dass die Hauptfunktion richtig 0.

zurückkehren konnte Das Problem besteht darin, dass Sie ein Integer-Array der Größe 4 erstellt haben, das jedoch 5 Elemente enthalten soll.

int numar[4]; 

bedeutet, dass das Array für 4 Elemente definiert ist:

numar[0] 
numar[1] 
numar[2] 
numar[3] 

Daher

numar[4] 

undefiniert.

Um dies zu beheben, Ihr Array eine Größe größer machen:

int numar[5]; 

Der Ausgang ich erhalte, ist:

array[0] is at address 0x7fff557f0730 with value 0 
array[1] is at address 0x7fff557f0734 with value 1 
array[2] is at address 0x7fff557f0738 with value 2 
array[3] is at address 0x7fff557f073c with value 3 
array[4] is at address 0x7fff557f0740 with value 4 
+0

Vielen Dank für Ihre Antwort. Ein dummer Fehler in meinem Namen. – chrismason954

1

Es gibt ein Problem mit dem Index, den Sie für Ihr Array verwenden.

Sie erstellen ein 4-Elemente-Array mit int numar[4]. Dies erzeugt ein Array, das die gültigen Indizes 0, 1, 2 und 3 hat. Es gibt keinen Index hier!

Wenn Sie also später füllen und das Array in den for Schleifen zugreifen, sollten Sie sie wie folgt aufgebaut:

for(x = 0; x < 4; x++) { 

x < **4**, nicht 5. Diese Schleife prüft die Indizes 0, 1, 2 und 3.

Ihre Schleife greift auf Element 10 zu, das nicht zum Array gehört.

2

Es tut uns leid, es gibt keine Möglichkeit, Array-Indizes von 1 beginnen, so dass sie von 0 beginnen. Wenn Sie also ein Array von 4 Elementen haben, ist das letzte Element Element mit Index 3 nicht 4.

In Ihrem Code lesen Sie fünf Elemente, in denen Sie nur ein Array von 4 Elementen haben.

for(x = 0; x < 5; x++) // iterating five times not 4: 0, 1, 2, 3, 4 
    //.... 

* das Schlimmste, was zu nicht-Elemente eines Arrays zu schreiben, ist auf andere Variablen Dongle zB:

int a = 0; // initialized to avoid compiler complaining later on 
int numar[4] = {0, 1, 2, 3}; // ok 
numar[4] = 77; // writing to the fifth element which doesn't belong to numar. as you can see variable a right before numar 

cout << a << endl; // a: 77!! where did a get this value? because a is right before numar so element five which doesn't belong to numar was allocated to a 

wir in diesem Beispiel dongled unbeabsichtigt auf andere Variablen (a) abd die meisten Frustrierende Sache ist, dass der Compiler nicht meckert (wir initialisierten a auf 0) das Ergebnis ist ein fehleranfälliges, das in einem riesigen Code wäre unmöglich zu erfassen.