View Full Version : [c] bus error inaspettato
Tel Mark
22-05-2009, 18:03
questo è un pezzo di codice:
lab = (int **)malloc(sizeof(int *) * righe);
for (i = 0; i <righe; i++)
lab[i] = (int *)malloc(sizeof(int) * colonne);
for(i=0; i<righe; i++) {
for(j=0; j<colonne; j++) {
scanf("%d", &lab[i][j]);}}
lancio il programma con dei valori da inserire nella mia matrice lab in buffer, non riesco a capire come mai dopo l'ultimo valore inserito, quindi a lab[righe-1][colonne-1] ottengo bus error. Ho fatto diverse prove inserendo varie printf qua e la nel codice, e l'errore sta proprio alla fine della scanf. boh
Energy++
22-05-2009, 18:06
comunque questo non è c#
Gia'. E' C.
Come e' dichiarata la matrice lab?
Inoltre dovresti controllare i valori di ritorno della Malloc, che nel caso restituisse NULL significherebbe errore nell'allcazione di memoria.
Tel Mark
22-05-2009, 19:47
corretto l'errore nel titolo chiedo venia
la matricè è int **lab
per sicurezza la scanf scrivila cosi: scanf("%d", &(lab[i][j]))
||ElChE||88
22-05-2009, 23:53
per sicurezza la scanf scrivila cosi: scanf("%d", &(lab[i][j]))
Spero proprio non usi un compilatore che viola la precedenza degli operatori. :fagiano:
Spero proprio non usi un compilatore che viola la precedenza degli operatori. :fagiano: con gli operatori unari io c'ho sempre il dubbio :fagiano:
per esempio, qual é il risultato ufficialmente definito dallo standard di questa espressione?
char n = 1;
return !~n;
e di questa?
char n = 1;
return ~!n;
ed inoltre... definito da quale standard? vale lo stesso per tutti, compresi quelli del C++?
con gli operatori unari io c'ho sempre il dubbio :fagiano:
per esempio, qual é il risultato ufficialmente definito dallo standard di questa espressione?
char n = 1;
return !~n;
e di questa?
char n = 1;
return ~!n;
ed inoltre... definito da quale standard? vale lo stesso per tutti, compresi quelli del C++?
Sceglierei un altro esempio perchè quelli sono operatori unari e a meno che non ci sia il complemento dell'operatore negazione o la negazione dell'operatore complemento direi che solo la più fantasiosa delle implementazione possa fare qualcosa di diverso dall'evidente.
||ElChE||88
23-05-2009, 02:13
con gli operatori unari io c'ho sempre il dubbio :fagiano:
& sta un "piano" sotto a [].
! e ~ invece sono sulo stesso "piano", per il quale vale l'ordine di lettura da destra.
Non so in quale standard siano definite precedenza/ordine, ma se fai una ricerca con google vedrai che i risultati sono sempre quelli (si trovano anche alcuni esempi di ambiguità).
sottovento
23-05-2009, 04:49
questo è un pezzo di codice:
lab = (int **)malloc(sizeof(int *) * righe);
for (i = 0; i <righe; i++)
lab[i] = (int *)malloc(sizeof(int) * colonne);
for(i=0; i<righe; i++) {
for(j=0; j<colonne; j++) {
scanf("%d", &lab[i][j]);}}
lancio il programma con dei valori da inserire nella mia matrice lab in buffer, non riesco a capire come mai dopo l'ultimo valore inserito, quindi a lab[righe-1][colonne-1] ottengo bus error. Ho fatto diverse prove inserendo varie printf qua e la nel codice, e l'errore sta proprio alla fine della scanf. boh
Ciao
1 - come ti ha detto gugoXX, occorre fare il controllo sul risultato della malloc(). In azienda, per esempio, consideriamo il mancato controllo un errore grave (blind faith).
2 - Hai un debugger? Se proprio non riesci a trovare l'errore potresti stampare l'indirizzo &lab[i][j]. Su una singola riga dovrebbe andare di 4 in 4, no?
Sceglierei un altro esempio perchè quelli sono operatori unari e a meno che non ci sia il complemento dell'operatore negazione o la negazione dell'operatore complemento direi che solo la più fantasiosa delle implementazione possa fare qualcosa di diverso dall'evidente. e l'evidente in questo caso sarebbe? :D
& sta un "piano" sotto a [].
! e ~ invece sono sulo stesso "piano", per il quale vale l'ordine di lettura da destra. e come funziona invece per gli operatori unari che stanno "sullo stesso piano" ma su due lati diversi dell'operando? per esempio in che ordine vengono eseguiti gli operatori nell'espressione "++n++"?
||ElChE||88
23-05-2009, 11:45
e come funziona invece per gli operatori unari che stanno "sullo stesso piano" ma su due lati diversi dell'operando? per esempio in che ordine vengono eseguiti gli operatori nell'espressione "++n++"?
L'espressione non ha senso perché non si può applicare l'operatore d'incremento ad una rvalue (il risultato del primo incremento).
Edit: comunque l'operatore postfisso e quello prefisso sono su livelli diversi.
e l'evidente in questo caso sarebbe? :D
Sia che la valutazione avvenga da sinistra verso destra, sia che avvenga da destra verso sinistra, comunque deve prima fare il complemento e poi la negazione nel primo caso e prima la negazione e poi il complemento nel secondo.
e come funziona invece per gli operatori unari che stanno "sullo stesso piano" ma su due lati diversi dell'operando? per esempio in che ordine vengono eseguiti gli operatori nell'espressione "++n++"?
L'incremento postfisso ha precedenza maggiore dell'incremento prefisso nello standard ISO IEC 9899:1999 (il C99). Le specifiche del C99 si possono scaricare da wikipedia (la terza revisione, sembra che ce ne sia anche una quarta).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.