2017-03-21 4 views
-3

I einfache lineare Suche im Code versuchen :: Blöcke IDE, ich habe untenErster Müll Wert als mein Suchwert in Code-Blöcken IDE

int main(){ 
int numbers[5] = {2,10,20,60,40},search = 60,i=0; 

for(i=0;i<=5;i++){ 
    printf("%d ",numbers[i]); 
    if(numbers[i]==search){ 
     printf("Index[%d] : Found\n",i); 
     //break; 
    }else{ 
     printf("Index[%d] : Not Found\n",i); 
    } 
} 
return 0; 
} 

codierte wie wenn ich nicht Pause Zustand bin mit und wenn Ich behalte i < = 5, das ist dann Array-Größe. Für i = 3 und für i = 5 bekomme ich die Ausgabe "Gefunden". Bitte siehe unten Bild

enter image description here

Meine Frage ist für i = 5, warum ich "gefunden" bin immer. Warum ist es nicht "Müllwert"?

+4

Die Indizes der Array-Elemente sind 0,1,2,3,4. Ihre Schleife liest über die Array-Grenze, indem Sie auf Index 5 gehen. Ändern Sie die Bedingung in < – StoryTeller

+1

'i <=5' ----->' i <5' .... am besten mit 'für (size_t i = 0; sizeof (numbers)/sizeof (Zahlen [0]); i ++) '....' printf ("Index [% zu]: Gefunden \ n", i); ' – LPs

+1

' int Zahlen [5] 'deklariert ein Array von ** 5 ** Elementen . Sie versuchen, ** 6 ** Elemente zu lesen, und das letzte ('Zahlen [5]') wird von außerhalb des Arrays gelesen. – axiac

Antwort

2

Das Hauptproblem besteht darin, dass Sie aufgrund von i<=5 auf Ihr Array außerhalb der Grenzen zugreifen. Diese Überprüfung erlaubt i zu 5, aber Indizes von Arrays mit beginnen von 0 bis size-1. Der maximal zulässige Index ist 4.

#include <stdio.h> 

int main(void) 
{ 
    int numbers[] = { 2, 10, 20, 60, 40 }; 
    int search = 60; 

    for (size_t i = 0; i < sizeof(numbers)/sizeof(numbers[0]); i++) 
    { 
     printf("%d ", numbers[i]); 

     if (numbers[i] == search) 
     { 
      printf("Index[%zu] : Found\n", i); 
      //break; 
     } 
     else 
     { 
      printf("Index[%zu] : Not Found\n", i); 
     } 
    } 
    return 0; 
} 

Wie Sie ich änderte auch die for mit sizeof(numbers)/sizeof(numbers[0]); sehen kann, die diesen Code gewährt die Schleife auf die reale Größe der Array-Auto-Anpassung, wenn Sie es ändern.

Schließlich änderte ich i Typ aufgrund sizeof Rückgabetyp, die size_t ist: das richtige Format printf Formatspezifizierer von size_t Typ %zu ist.

EDIT

Der Versuch, zu erklären, warum "Found" in diesem speziellen Fall gedruckt wird, können wir

----------------------------------------------------------------- 
| array[0] | array[1] | array[2] | array[3] | array[4] | search | 
----------------------------------------------------------------- 
                  ^
                  | 
                  ------------ 
                  | array[5] | 
                  ------------ 

So sehen Sie, wie zugewiesene Variable sind, wenn Sie array[5] zuzugreifen, werden Sie tatsächlich Zugriff Wert von search Variable, das ist 60. So

if(numbers[i]==search) 

als

if(search==search) 

die offensichtlich true ist zu sehen.

+0

Ich weiß, dass ich i <= 4 verwenden soll, meine Frage ist, warum ich" gefunden "bekomme? Warum nicht Fehler oder Müll? –

+2

@SatuSultana - Was macht 60 weniger Müll als 81? – StoryTeller

+1

Es ist [undefiniertes Verhalten] (https://en.wikipedia.org/wiki/Undefined_behavior), also kann alles passieren. Es gibt keine Laufzeitprüfung von Bouds von Arrays. Sie greifen also auf ein "int" nach Array-Grenzen zu, die einen beliebigen Wert speichern können. In Ihrem speziellen Fall denke ich ist der Wert von 'search' Variable, also' 60' ... – LPs