Volevo ringraziarti perché grazie a questi tuoi video ho imparato un sacco di nozioni, inoltre mi piace molto come riesci a essere sintetico senza però perdere di qualità nei contenuti
Esce una lezione a settimana ogni venerdì alle 14.00 e in ordine (partendo da questa settimana) ci saranno: -Strutture e liste -Esercizi su strutture e liste -File -Preprocessore -Risoluzioni esami università secondo parziale Poi in teoria dovrei inserire alla fine anche altri due video: -Gestione caratteri -Uso del debugger
Ho delle domande: 1) All' interno del malloc, nei parametri del sizeof, posso specificare il nome della variabile che voglio allocare in memoria? es: int vet[10]; int *dinamico= malloc(sizeof(vet[10]*10)); 2) Qualunque operazione faccia, con un puntatore di tipo intero salvato nel malloc, esempi visti prima con i cicli for : int *c= malloc(sizeof(int)); for (int i=0; i
Per l'1,2,3 ci sono varie criticità che spero di aver spiegato bene nel video (ma se mi chiedi questo allora ho fatto varie negligenze). Quando si lavora con la heap bisogna per forza specificare sin da subito quanto spazio vogliamo riservare. Quindi nel caso (1) tu per dargli 40 byte (int 4byte per 10 spazi) devi semplicemente indicare la sizeof(int) * 10. Scrivere malloc(sizeof(vet[10]*10)); non corrisponde ad allocare dinamicamente la variabile (vettore in questo caso) in memoria: vet[10] non è una cella nemmeno allocata per vet stesso, mettere dentro sizeof una cella non esistente * 10 penso che non sia quello che tu voglia fare. L'opzione corretta deve essere: malloc(sizeof(int)*10), oppure se hai già un vettore locale malloc(sizeof(vet)), e attento che quest'ultimo giochino non è sempre dei migliori. Nel punto (2) hai allocato lo spazio di 4 byte, nulla di più. Questo ovviamente non ti preclude il fatto che tu possa andare a salvare valori fuori dallo spazio che hai allocato, però non hai garanzia che rimangano salvati finché ti servono. Cioè se hai 10 numeri da memorizzare e tu allochi lo spazio solo per 1, sicuramente per quest'uno non ci sono problemi, ma per i successivi 9 potresti perderli. Quindi devi allocare tutto lo spazio che effettivamente ti occorre, non di meno (al massimo puoi riallocare). Nel punto (3) no. Un puntatore punta a un indirizzo di memoria. Puoi certamente farci qualsiasi cosa tu voglia, ma effettuare le operazioni prima di avere la memoria su cui lavorare sarebbe come scrivere un tema nella propria mente senza avere il foglio protocollo... Punto (4) io intendo effettivamente che il sistema operativo non è stato in grado di assegnarti della memoria, o perché è finita o per altri motivi. La malloc, come qualsiasi system call, può fallire per X motivi. Nel momento in cui non ti dà l'indirizzo di memoria per l'allocazione richiesta, allora con il valore di ritorno NULL sai come poter gestire l'errore. Il Memory leak e Dangling Pointer sono altre cose: - il primo è quando hai un pezzo di memoria che non hai deallocato (motivo per cui è sempre importante la free dopo aver concluso il lavoro) - il secondo è quando hai un puntatore che punta a una zona di memoria non più valida
Volevo ringraziarti perché grazie a questi tuoi video ho imparato un sacco di nozioni, inoltre mi piace molto come riesci a essere sintetico senza però perdere di qualità nei contenuti
Ciao, ci saranno altri tutorial sul C dopo questo? Se sì, per quanto si protrarrà il corso? Grazie mille!
Esce una lezione a settimana ogni venerdì alle 14.00 e in ordine (partendo da questa settimana) ci saranno:
-Strutture e liste
-Esercizi su strutture e liste
-File
-Preprocessore
-Risoluzioni esami università secondo parziale
Poi in teoria dovrei inserire alla fine anche altri due video:
-Gestione caratteri
-Uso del debugger
Ho delle domande:
1) All' interno del malloc, nei parametri del sizeof, posso specificare il nome della variabile che voglio allocare in memoria?
es:
int vet[10];
int *dinamico= malloc(sizeof(vet[10]*10));
2) Qualunque operazione faccia, con un puntatore di tipo intero salvato nel malloc, esempi visti prima con i cicli for :
int *c= malloc(sizeof(int));
for (int i=0; i
Per l'1,2,3 ci sono varie criticità che spero di aver spiegato bene nel video (ma se mi chiedi questo allora ho fatto varie negligenze).
Quando si lavora con la heap bisogna per forza specificare sin da subito quanto spazio vogliamo riservare. Quindi nel caso (1) tu per dargli 40 byte (int 4byte per 10 spazi) devi semplicemente indicare la sizeof(int) * 10. Scrivere malloc(sizeof(vet[10]*10)); non corrisponde ad allocare dinamicamente la variabile (vettore in questo caso) in memoria: vet[10] non è una cella nemmeno allocata per vet stesso, mettere dentro sizeof una cella non esistente * 10 penso che non sia quello che tu voglia fare. L'opzione corretta deve essere: malloc(sizeof(int)*10), oppure se hai già un vettore locale malloc(sizeof(vet)), e attento che quest'ultimo giochino non è sempre dei migliori.
Nel punto (2) hai allocato lo spazio di 4 byte, nulla di più. Questo ovviamente non ti preclude il fatto che tu possa andare a salvare valori fuori dallo spazio che hai allocato, però non hai garanzia che rimangano salvati finché ti servono. Cioè se hai 10 numeri da memorizzare e tu allochi lo spazio solo per 1, sicuramente per quest'uno non ci sono problemi, ma per i successivi 9 potresti perderli. Quindi devi allocare tutto lo spazio che effettivamente ti occorre, non di meno (al massimo puoi riallocare).
Nel punto (3) no. Un puntatore punta a un indirizzo di memoria. Puoi certamente farci qualsiasi cosa tu voglia, ma effettuare le operazioni prima di avere la memoria su cui lavorare sarebbe come scrivere un tema nella propria mente senza avere il foglio protocollo...
Punto (4) io intendo effettivamente che il sistema operativo non è stato in grado di assegnarti della memoria, o perché è finita o per altri motivi. La malloc, come qualsiasi system call, può fallire per X motivi. Nel momento in cui non ti dà l'indirizzo di memoria per l'allocazione richiesta, allora con il valore di ritorno NULL sai come poter gestire l'errore.
Il Memory leak e Dangling Pointer sono altre cose:
- il primo è quando hai un pezzo di memoria che non hai deallocato (motivo per cui è sempre importante la free dopo aver concluso il lavoro)
- il secondo è quando hai un puntatore che punta a una zona di memoria non più valida
quando si usa il simbolo ->