2012-12-24 22 views
10
int main(void) 
{ 
    int i; 
    int array[5]; 

    for (i = 0; i <= 20; i++) 
    array[i] = 0; 

    return 0; 
} 

Perché il codice sopra riportato è bloccato in un ciclo infinito?Perché c'è un ciclo infinito nel mio programma?

+6

scribble pila ... Ma congratulazioni! Hai scritto un programma di 5 linee che non fa nulla e che dura ancora per molto tempo! –

+7

Downvoters: il down è utilizzato quando le domande sono scritte male o non seguono le regole del sito, non per banali domande! –

+2

possibile duplicato di questa domanda .. http://stackoverflow.com/questions/13010004/whats-happening-here-in-this-for-loop – Omkant

risposta

8

Ecco cosa accade nel codice indicato.

#include<stdio.h> 
#include<string.h> 
int main(void) 
{ 
    int i; 
    int array[5]; 

    for (i = 0; i <= 20; i++) 
    { 
     printf("%p %p \n",&i,&array[i]); 
     printf("the value of i is %d \n",i); 
     sleep(1); 
     array[i] = 0; 
     printf("i may be modified here lets see what i is %d \n", i); 
    } 

    return 0; 
} 

nella mia memoria pila ho avuto la posizioni di indirizzo come

i è memorizzato nella posizione indirizzo 0xbfd1048c

e array viene memorizzato nella posizione 0xbfd10478 indirizzo

Come si sta incrementando i valore per ogni loop in un determinato momento l'indirizzo di array[i] è equivalente all'indirizzo i (il suo semplice dereferenziamento puntatore)

Allora, cosa si archiviano in array[i] non è altro che l'i 'indirizzo esempio s in modo che siano più di scrivere il i' valore di esempio s a 0 come lei ha detto array[i] = 0 che è equivalente al i=0 quindi la condizione i<=20 riesce sempre.

Ora la GRANDE domanda perché la memoria è stata assegnata in questo modo.

Viene deciso in fase di esecuzione e sulla disponibilità delle risorse per il kernel.

Ecco perché dobbiamo soffermarci nei limiti della matrice.

+5

Il codice di esempio e la registrazione degli indirizzi è un buon approccio per una risposta. Un piccolo punto: l'offset tra gli elementi nello stack è stato deciso in fase di compilazione, non in fase di esecuzione. – simonc

+0

Il layout dello stack-frame (sia i che array sono in pila) è deciso dal compilatore – josefx

21

Si dichiara un array con 5 elementi ma si scrivono 21 elementi. Scrivere oltre la fine di un array comporta un comportamento indefinito. Nel tuo caso, stai scrivendo sul contatore di loop i, reimpostandolo su 0, probabilmente quando assegni a array[5].

Se si vuole risolvere il vostro programma, cambiare il ciclo di scrivere il numero corretto di elementi

int num_elems = sizeof(array)/sizeof(array[0]); 
for (i = 0; i < num_elems ; i++) 
8

si invoca un comportamento indefinito sovrascrivendo oltre la memoria è permesso. Quindi tutto può succedere.

Molto probabilmente, sta sovrascrivendo il contatore del ciclo.

2

Il problema si verifica quando si tenta di accedere a un elemento esterno ai limiti dell'array, che è solo 5 grande, ma in un ciclo di 21 dimensioni.

int main(void) 
{ 
    int i; 
    int array[5]; 

    for (i = 0; i < 5; i++) 
    array[i] = 0; 

    return 0; 
} 
+2

C, non C# - nessun errore. –

1

Non vedo alcuna condizione di ciclo infinito, ma si impostano fino a 20 valori su un array con 5 "slot" ???

+1

Esegui codice prima di rispondere. –

Problemi correlati