Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156

    [C]utilizzo di malloc con stringhe... dubbi

    non riesco più a capire quando devo utilizzare la funzione malloc e quando no.
    se fino a poco tempo fa mi sembrava tutto così chiaro, ora mi sembra tutto + oscuro...
    se io devo assegnare una stringa ad un puntatore, devo utilizzre malloc?

    per esempio
    codice:
    main(){
    char string1[SIZE];
    char *string2;
    
    printf("\nSTRING? ");
    fgets (string1, SIZE, stdin);
    
    string2 = string1;
    
    puts (string2);
    
    }
    in questo caso dovrei prima allocare la memoria di string2 per permetterle di contenere esattamente la stringa del vettore string1?
    se sì, perchè il programma funziona comunque correttamente?
    so che la memoria allocata con malloc viene allocata nello heap, ma non capisco se in questo caso è utile farlo e perchè...

  2. #2
    Attenzione l' istruzione :

    string2 = string1;

    non fa una copia della string1.

    Fa si che il puntatore a char string2 punti all'indirizzo di string1,
    ossia al primo elemento del vettore string1 ( &string1[0] )
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C]utilizzo di malloc con stringhe... dubbi

    Originariamente inviato da ilmo lesto
    non riesco più a capire quando devo utilizzare la funzione malloc e quando no.
    La allocazione dinamica della memoria serve quando si è nei seguenti casi:

    a) La dimensione del blocco di memoria non è conosciuta a priori (ad esempio determinata a runtime in base ad altre condizioni).

    b) La dimensione del blocco di memoria è notevolmente grande (su questo si potrebbe discutere, ovviamente ....)

    c) Il blocco di memoria va allocato dinamicamente perché deve essere restituito da una funzione o in situazioni in cui si deve avere della memoria a sé stante non globale o cose del genere.

    Originariamente inviato da ilmo lesto
    codice:
    main(){
    char string1[SIZE];
    char *string2;
    
    printf("\nSTRING? ");
    fgets (string1, SIZE, stdin);
    
    string2 = string1;
    
    puts (string2);
    
    }
    Perfetto, leggi da stdin e depositi i caratteri in string1. Poi l'indirizzo di string1 lo assegni a string2. NON copi la stringa, solo il puntatore: string2 punta all'array string1 e basta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    grazie ragazzi,

    se io, anzichè assegnare l'idirizzo di string1 a string2, avessi copiato i caratteri con strcpy, in questo caso ovviamente avrei prima dovuto allocare la memoria per string2...

    guardate allora quest'altro frammento di codice. I casi sono due: potrei pensare che il puntatore char *str debba essere allocato dinamicamente (quindi il codice è concettualmente errato), perchè in questo modo la funzione ritorna un indirizzo che punta ad una variabile allocata nello stack. quindi quando esco dalla funzione la variabile viene distrutta. però penso anche ad un'altra cosa: io assegno a str un indirizzo di un parametro della funzione, quindi magari quando esco dalla funzione l'indirizzo rimane valido perchè è quello di una variabile dichiarata all'esterno della stessa... dove sta la verità?
    spero di essermi spiegato

    codice:
    typedef struct tag_stackNode{
    	
    	char string[SIZE_BUF];
    	struct tag_stackNode *nextPtr;
    	
    } StackNode;
    
    typedef StackNode *stacknodePtr;
    
    char *stackTop (stacknodePtr headPtr){
    	
    	char *str;
    	
    	str = headPtr->string;
    	
    	return str;
    	
    }

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da ilmo lesto
    se io, anzichè assegnare l'idirizzo di string1 a string2, avessi copiato i caratteri con strcpy, in questo caso ovviamente avrei prima dovuto allocare la memoria per string2...
    Beh, sì. Allocavi sufficiente memoria per la stringa, assegnavi l'indirizzo del blocco a string2 e quindi copiavi da string1 a string2 con strcpy.


    Originariamente inviato da ilmo lesto
    codice:
    typedef struct tag_stackNode{
    	
    	char string[SIZE_BUF];
    	struct tag_stackNode *nextPtr;
    	
    } StackNode;
    
    typedef StackNode *stacknodePtr;
    
    char *stackTop (stacknodePtr headPtr){
    	
    	char *str;
    	
    	str = headPtr->string;
    	
    	return str;
    	
    }
    Mettiamola così: qualcuno chiama la funzione stackTop() passando l'indirizzo di una struttura StackNode e si presuppone che non sia un NULL e che la struttura sia correttamente allocata da qualche parte (se sullo stack o sul heap non ha importanza).
    Tu prendi l'indirizzo del campo 'string', lo metti in str e poi lo restituisci. Punto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    quindi mi stai dicendo che questo è un assegnamento corretto, giusto?

    ecco allora un altro esempio

    codice:
    char *getString (void);
    
    int main(){
    	
    	char *string
    	
    	string = getString();
    	
    	puts (string);
    	
    	return 0;
    	
    }
    
    char *getString (void){
    	
    	char *str = "la mia stringa";
    	
    	return str;
    }
    anche in questo caso vale lo stesso discorso?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da ilmo lesto
    codice:
    char *getString (void);
    
    int main(){
    	
    	char *string
    	
    	string = getString();
    	
    	puts (string);
    	
    	return 0;
    	
    }
    
    char *getString (void){
    	
    	char *str = "la mia stringa";
    	
    	return str;
    }
    anche in questo caso vale lo stesso discorso?
    Certo, è perfettamente corretto.

    Quello che succede è solamente la copia e il passaggio di un puntatore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    un grazie di cuore a tutti!

    mi avete chiarito un sacco di dubbi!

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.