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.