Esercizio originale...

di il
5 risposte

Esercizio originale...

Questo è un esercizio proposto in una sessione d'esame:

#include <stdio.h>
#include <stdlib.h>
#define L 20

void Proc(char [],int );
int N=L;

main() {
char *s;
int i;
s = (char *) malloc(L);
s = "Fondamenti di infor";
Proc(s,L);
....
}
void Proc(char y[],int DIM) {
int i,N;
N++; i=1;
printf("qui N vale: %d\n",N);
while(i<DIM) {y=y[0]; i=i+5;}
}
mi chiedevo ( come l'esercizio richiede ) nella funzione Proc la printf stamperà N con il valore 21, quindi considerando N come variabile globale, oppure stamperà il valore della variabile locale N non inizializzata+1 ?

quesito 2:
premetto ho provato a compilare con Visual Studio 5 su winXp;
nella quarta riga del main se inserisco un stringa + lunga di 20 caratteri il programma non si scompone minimamente anche se dovrebbe darmi... access violation... ???????????????????? come mai ??

quesito 3:
il ciclo while dentro il proc ( sorvolando sul senso di quel ciclo ) già quando i vale 1, quindi quando prova a sostituire F in y[1] mi da violazione di accesso di memoria proprio all'indirizzo di y[1] e il programma crasha.... perkè ???? succede tutto il contrario di quello che dovrebbe accadere...

Inoltre non capisco bene quella malloc che cosa allochi... ritorna un puntatore a char e alloca veramente un array di 20 caratteri di char ???? o 20 puntatori a char... ??

tralascio il resto del programma in quanto non sn stato in grado di debuggarlo... ed in quanto i livelli di assurdità sono disastrosi...

5 Risposte

  • Re: Esercizio originale...

    Quel programma è fatto coi piedi e chi la fatto meriterebbe un 1 per l'impegno di scrivere righe a muzzo. Appena ho un po di tempo ti faccio una spiegazione dettagliata.
  • Re: Esercizio originale...

    Ecco a te la spiegazione:
    
    #include <stdio.h>
    #include <stdlib.h>
    #define L 20
    
    void Proc(char [],int );
    int N=L;
    
    main() 
    // dichiarazione main non valida
    // main ha due forme di dichiarazione
    // 1. int main()
    // 2. int main(int argc, char **argv)
    {
    	char *s;
    	int i;
    // variabile i dichiarato ma non usato
    	s = (char *) malloc(L);
    // s punta a una cella di memoria ritornata da malloc
    	s = "Fondamenti di infor";
    // s PERDE la locazione di memoria prima definita e
    // punta ad un altra memoria STATICA (non modificabile)
    // creata dal compilatore con la dichiarazione della stringa
    
    	Proc(s,L);
    // chiamare questa funzione darebbe la morte certa del programma
    // perche non puoi modificare il contenuto di s
    
    // all'uscita del main abbiamo un memory leak dovuto
    // al malloc che non possiamo più liberare in quanto s
    // non punta più all'indirizzo della memoria allocata
    // da malloc.
    }
    void Proc(char y[],int DIM)
    {
    	int i,N;
    	N++; 
    	// N (locale) incrementata senza essere inizializzata
    	i=1;
    	printf("qui N vale: %d\n",N);
    	//stamperà N (locale) dio sa con che valore
    
    	while(i<DIM)
    	{
    		y[i]=y[0]; 
    		// crash del programma
    		// y[i] non può essere modificata essendo la stringa
    		// s non modificabile (STATICA)
    		i=i+5;
    	}
    }
    

    In conclusione sto programma ha mille bug.
  • Re: Esercizio originale...

    Grazie mille !!!! quella della "s PERDE la locazione di memoria prima definita e punta ad un altra memoria STATICA (non modificabile) " mi mancava... pensavo che salvasse la stringa nello spazio allocato... ora mi è tutto più chiaro !! grazie ancora !!!
  • Re: Esercizio originale...

    Perdona un ultima curiosità ! non so nemmeno se abbia senso la domanda... e io volessi salvare quella stringa proprio nello spazio di memoria che ho allocato con la malloc ?? si può fare ?? come ?
  • Re: Esercizio originale...

    Con strcpy.
    
    strcpy(s,"Fondamenti di infor");
    
    qui andrà in crash se lo spazio è + piccolo della stringa da copiare.
Devi accedere o registrarti per scrivere nel forum
5 risposte