2013-01-19 20 views
17

Im abbastanza nuovo per la codifica in C e attualmente sto cercando di creare una funzione che restituisce un array c stringa/char e assegnando a una variabile.Restituisce char []/stringa da una funzione

Finora, ive ha osservato che restituire un char * è la soluzione più comune. Così ho provato:

char* createStr() { 
    char char1= 'm'; 
    char char2= 'y'; 
    char str[3]; 
    str[0] = char1; 
    str[1] = char2; 
    str[2] = '\0'; 
    char* cp = str; 
    return cp; 
} 

mia domanda è come faccio a utilizzare questa tornato char * e assegnare l'array di caratteri a cui punta, ad una variabile char []?

Ive ha provato (tutto portato a noob-annegamento errori):

  1. char * Charp = createStr();
  2. char myStr [3] = & createStr();
  3. char * charP = * createStr();

risposta

21

Nota che non stai allocando dinamicamente la variabile, il che significa praticamente che i dati all'interno di str, nella tua funzione, andranno persi alla fine della funzione.

Si dovrebbe avere:

char * createStr() { 

    char char1= 'm'; 
    char char2= 'y'; 

    char *str = (char *) malloc(sizeof(char) * 3); 
    str[0] = char1; 
    str[1] = char2; 
    str[2] = '\0'; 

    return str; 

} 

Poi, quando si chiama la funzione, il tipo della variabile che riceverà i dati devono corrispondere a quello del ritorno della funzione. Quindi, dovresti avere:

char *returned_str = createStr(); 
+4

'sizeof (char)' è garantito essere 1 e non c'è motivo di digitare il ritorno 'malloc' –

+1

@Aniket +1 Grazie per il commento. A volte mi è stato detto da amici, ma suppongo di non aver capito il problema per il momento, e più tardi non ci avevo più pensato: D – Rubens

5

Se si desidera restituire un char* da una funzione, assicurarsi che sia malloc() esso. Lo stack di array di caratteri inizializzati non ha senso nel tornare, poiché accedervi dopo essere tornati da quella funzione è un comportamento indefinito.

cambiamento a

char* createStr() { 
    char char1= 'm'; 
    char char2= 'y'; 
    char *str = malloc(3 * sizeof(char)); 
    if(str == NULL) return NULL; 
    str[0] = char1; 
    str[1] = char2; 
    str[2] = '\0'; 
    return str; 
} 
+5

Ne valga ricordare che il valore restituito deve essere liberato per evitare perdite di memoria. 'char * astr = createStr(); doSomething (astr); gratuito (astr); ' – Vassilis

+0

Questo era quello che stavo cercando! Ero un po 'confuso pensando che restituire un puntatore dalla funzione potrebbe causare perdite di memoria. La tua risposta ha risolto la mia domanda. Quindi la memoria trattenuta da char * astr viene finalmente rilasciata. (In Java, ad esempio, capisco che questo non è un problema, perché il garbage collector si prenderà cura) – hrushi

5
char* charP = createStr(); 

sarebbe corretto se la funzione è stata corretta. Sfortunatamente stai restituendo un puntatore a una variabile locale nella funzione, il che significa che è un puntatore a dati non definiti non appena la funzione ritorna. È necessario utilizzare l'allocazione dell'heap come malloc per la stringa nella funzione in modo che il puntatore restituisca un significato. Quindi è necessario ricordarsi di liberarlo in seguito.

0

Includere "string.h" semplifica le cose. Un modo più semplice per affrontare il problema è:

#include <string.h> 
    char* createStr(){ 
    static char str[20] = "my"; 
    return str; 
} 
int main(){ 
    char a[20]; 
    strcpy(a,createStr()); //this will copy the returned value of createStr() into a[] 
    printf("%s",a); 
    return 0; 
} 
+0

Perché fare una copia? 'char * a = createStr();' funzionerebbe allo stesso modo. – melpomene

+0

Sì, puoi usare anche quello e questo ti farà risparmiare un po 'di memoria, è solo che ha chiesto un modo per "assegnare il char array a cui punta (funzione), a una variabile char []" così gli ho detto proprio questo. – Adnan

Problemi correlati