PDA

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#

gugoXX
22-05-2009, 19:01
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

fero86
22-05-2009, 23:50
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:

fero86
23-05-2009, 00:45
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++?

PGI-Bis
23-05-2009, 01:12
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?

fero86
23-05-2009, 10:36
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.

PGI-Bis
23-05-2009, 14:45
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).