Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-04-2005, 18:35   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
[C] Funzione free

Ho scritto questo semplice programmino che alloca dinamicamente un array con calloc, poi lo riempie e infine dovrebbe liberare la memoria precedentemente allocata con free ma quest'ultimo punto mi crea qualche problema....come mai non mi libera la memoria?

#include <stdlib.h>
#include <stdio.h>

/* Non riceve alcun parametro ed emette un puntatore a float */
int * get_mem(void);

int main(void){

int i;
int *puntatore; // Puntatore al primo valore float dell'array allocato

/* Alloca la memoria dinamicamente e metti il valore del puntatore uscente
dalla funzione get_mem nellaa variabile puntatore */

puntatore = get_mem();


printf("\nValore contenuto in puntatore: %p\n\n\n\n", puntatore);

for(i=0; i<100; i++){
*(puntatore + i) = i; // Inizializza l'array con il valore di i
}

/* Visualizza l'array allocato dinamicamente */

for(i=0; i<100; i++){
printf("Indirizzo: %p Valore: %d\n", &puntatore[i],puntatore[i]);
}
printf("\n\n\n\n\nValore contenuto in puntatore: %p\n\n\n\n", puntatore);

/* Libera la memoria precendetemente allocata */

for(i=0; i<100; i++)
free(puntatore[i]);

printf("%d", puntatore[2]);

system("PAUSE");
return 0;
}

/* La funzione get_mem non riceve alcun parametro in ingresso e restituisce un
puntatore al primo valore di tipo float dell'array di 100 elementi allocato
dinamicamente */

int *get_mem(void){

int *p; // Puntatore al primo elemento di tipo float dell'array

/* Alloca memoria per un array di 100 elementi di tipo float */
p = calloc(100, sizeof(int));

if(!p){ // Se calloc restituisce un puntatore NULL
printf("Errore di allocazione della memoria\n");
exit(1);
}
return p;
}
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 18:46   #2
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
Non vorrei sbagliare, ma quando usi malloc e calloc devi sempre convertire a puntatore al tipo che vuoi.
Prova a usare questa:
Codice:
int *get_mem(void)
{
    int *p;

    p = (int*)calloc(100*sizeof(int));
    if (p==NULL)
        exit(1);

    return p;
}
o questa:
Codice:
int *get_mem(void)
{
    void *p;

    p = calloc(100*sizeof(int));
    if (p==NULL)
        exit(1);

    return (int*)p;
}
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 18:47   #3
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
prima di tutto la sintassi è sbagliata.

A free() devi passare un puntatore , non un dato.

facendo "free(puntatore[i]);" passi il valore contenuto in "puntatore[i]" alla funzione free() che cercherà di liberare la memoria all' indirizzo di memoria indicato da puntatore[i] (e quindi 1, 2, 3 , 4 , 5 ,6 ... strano che non ti sia andato in segmentation fault) .

per liberare tutto l'array è sufficiente dare "free(puntatore);" e dovrebbe andare.

In ogni caso c'è la possibilità che i valori rimangano in memoria e che quindi visualizzi ugualmente il valore. Infatti free() non cancella la memoria, semplicemente la rende disponibile per un altro programma che ne abbia necessità. Comunque accedere a una locazione di memoria non allocata come fai nella riga :

printf("%d", puntatore[2]);

a seconda del sistema operativo potrebbe portare a un segmentation fault.

Ciao

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 18:51   #4
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da AnonimoVeneziano
prima di tutto la sintassi è sbagliata.

A free() devi passare un puntatore , non un dato.

facendo "free(puntatore[i]);" passi il valore contenuto in "puntatore[i]" alla funzione free() che cercherà di liberare la memoria all' indirizzo di memoria indicato da puntatore[i] (e quindi 1, 2, 3 , 4 , 5 ,6 ... strano che non ti sia andato in segmentation fault) .

per liberare tutto l'array è sufficiente dare "free(puntatore);" e dovrebbe andare.

In ogni caso c'è la possibilità che i valori rimangano in memoria e che quindi visualizzi ugualmente il valore. Infatti free() non cancella la memoria, semplicemente la rende disponibile per un altro programma che ne abbia necessità. Comunque accedere a una locazione di memoria non allocata come fai nella riga :

printf("%d", puntatore[2]);

a seconda del sistema operativo potrebbe portare a un segmentation fault.

Ciao

Ciao

mmm grazie...ora provo...la cosa strana è che sul McGrowHill faceva come avevo scritto io...poi vi posto il suo esempio
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 18:51   #5
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
Ancora un altro paio di cose:
Codice:
    free(puntatore[i]);
puntatore[i] è un int, non un puntatore a int; e non dovresti potergli applicare free.
Il compilatore ti dovrebbe dare quantomeno un warning.
Devi chiamare direttamente:
Codice:
    free(puntatore);
che libera tutta la memoria che hai allocato a partire da lì.
Solo che, a quel punto, la chiamata a printf non sarebbe lecita in quanto fai riferimento a una zona della memoria che non è più allocata.

EDIT: stavo scrivendo questo post quando AnonimoVeneziano ha inserito la sua replica...
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 18:53   #6
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
Quote:
Originariamente inviato da D4rkAng3l
mmm grazie...ora provo...la cosa strana è che sul McGrowHill faceva come avevo scritto io...poi vi posto il suo esempio
Di quale McGraw-Hill parli? Sarà mica il Bullschildt?
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 19:58   #7
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
perchè non è buono?io mi ci trovo bene...sicuramente meglio del daitel & daitle...che ha che non và?
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 20:33   #8
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
Quote:
Originariamente inviato da D4rkAng3l
che ha che non và?
Se hai seguito il link che ho inserito nel mio post precedente, dovresti avere già un indizio.
L'articolo all'origine di tutto è questo.
Anche su ACCU.org (Association of C and C++ Users) non lo trattano certo bene.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 21:50   #9
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da D4rkAng3l
perchè non è buono?io mi ci trovo bene...sicuramente meglio del daitel & daitle...che ha che non và?

Il deitel & deitel per me è un buon libro
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 01-05-2005, 13:07   #10
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da AnonimoVeneziano
Il deitel & deitel per me è un buon libro
si per carità però ripete sempre le stesse cose, per spiegarti una cosa ti fà i discorsi lunghissimi....
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 01-05-2005, 13:42   #11
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
ma almeno ti dice le cose corrette e non ti scrive cose sbagliate
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
L'intelligenza artificiale ha reso pi&ug...
L'intelligenza artificiale per lo svilup...
Il sistema di verifica dell'identit&agra...
Ora è ufficiale: Samsung sta per ...
Motorola Edge 70 Fusion: ecco le specifi...
8TB a meno di 170€: il richiestissimo Ha...
Il nuovo MacBook 'low cost' arriver&agra...
Pokémon Rosso Fuoco e Verde Fogli...
Risparmiare con le offerte Amazon: weeke...
Gli Xiaomi 17 arrivano a fine febbraio, ...
48.000 Pa a poco più di 100€: la ...
PC più potente, meno spesa: su Amazon to...
Con 2 acquisti si ottiene il 40% di scon...
Blocco VPN in Spagna durante le partite ...
ECOVACS DEEBOT T30C OMNI GEN2 torna a 34...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:07.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v