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?
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?
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.
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
Il layout dello stack-frame (sia i che array sono in pila) è deciso dal compilatore – josefx
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++)
si invoca un comportamento indefinito sovrascrivendo oltre la memoria è permesso. Quindi tutto può succedere.
Molto probabilmente, sta sovrascrivendo il contatore del ciclo.
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;
}
C, non C# - nessun errore. –
Non vedo alcuna condizione di ciclo infinito, ma si impostano fino a 20 valori su un array con 5 "slot" ???
Esegui codice prima di rispondere. –
scribble pila ... Ma congratulazioni! Hai scritto un programma di 5 linee che non fa nulla e che dura ancora per molto tempo! –
Downvoters: il down è utilizzato quando le domande sono scritte male o non seguono le regole del sito, non per banali domande! –
possibile duplicato di questa domanda .. http://stackoverflow.com/questions/13010004/whats-happening-here-in-this-for-loop – Omkant