Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] Consiglio su variabili nelle funzioni

    Volevo avere un consiglio:

    dal momento che una variabile dichiarata in una funzione è visibile solo all'interno della stessa vuol dire che questa ha vita finchè dura l'esecuzione della funzione, giusto?
    Quindi non è necessario porre al termine della funzione ilcomando free per liberare la memoria?

    Codice PHP:
    void funzione_qualsiasi(){
       
    char stringa[200];
       ...
       ...
       
    free (stringa); // questo comando in questo caso si può omettere?


  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    free() si usa per la memoria allocata con calloc() o malloc()

    Nel tuo caso non solo non serve ma è anche sbagliato...

  3. #3
    Se non sbaglio la ram resta comunque occupata da quel comando, anche se la funzione è terminata. Si libera solo se chiudi il programma (correggetemi se erro)

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    20
    secondo me erri...
    è vero che l'array stringa è statico, ma non essendo globale esiste in memoria soltanto durante il suo scope, cioè l'esecuzione della funzione ! quando la funzione ritorna se ne perde traccia e la memoria viene liberata (senza bisogno del free che in questo caso crea casini). Altrimenti ci sarebbero parecchi problemi, primo tra tutti il fatto che se chiamo la stessa funzione 1000 volte ci sarebbero qualcosa come 200kb di memoria persa nel nulla, cosa che un compilatore ottimizzante non permette di certo!
    Le variabili locali (dichiarate all'inizio del corpo della funzione) vengono allocate nello stack al momento della chiamata a funzione. Se la funzione non viene chiamata mai, non ci sarà mai nessun array stringa in memoria!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Ha ragione alexfin

    Cmq il problema è che è un ERRORE usare free() per liberare quella stringa

    free() libera la memoria allocata dinamicamente nello heap da malloc() oppure calloc()


  6. #6
    anch'io ero di questo parere... ma compilando non ho ricevuto alcun errore

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    20
    Anche secondo me è un grave errore usare free() in questo contesto... Chiamare free passandogli un puntatore a char sintatticamente immagino sia corretto, quindi può benissimo compilare. Comunque il compilatore dovrebbe dare almeno un warning no?
    Ma dopo aver compilato funziona??? Come fa la free ad agire all'interno dello stack??? e se lo fa, modificando il contenuto dello stack, si dovrebbe verificare un segmentation fault quando la funzione ritorna...

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Infatti hai provato in esecuzione il programma?

    Sotto Win o Linux?

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    20
    Ho provato questo:

    #include <stdlib.h>
    void stringa() {
    char str[100];
    free(str);
    }
    int main ( int argc, char * argv[] ) {
    stringa();
    return 0;
    }

    Sotto linux, gcc 3.2.3. Compila senza nessun warning, in esecuzione da "segmentation fault". Probabilmente nemmeno al momento del ritorno, ma durante la free stessa! Senz'altro un brutto errore di programmazione, totalmente ignorato dal compilatore...

  10. #10
    Un compilatore non e' preposto a dare informazioni riguardo errori logici, ma solo di sintassi. Non può prevedere quello che tu voglia fare ed è giustissimo che non dia un errore, visto che sintatticamente non ce ne sono. Per gli errori logici (di malfunzionamento del programma) puoi affidarti ad un efficiente debugger o lavorare un po col cervello.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.