View Full Version : [C] Ritornare una stringa al chiamante.
ciusss89
17-09-2011, 16:22
Ciao, ho un semplice problema, di un programma di preparazione ad un esame, riassunto in un esempio qui sotto.
Non riesco a ritornare correttamente una stringa al chiamante. Qui il mio banalissimo codice, la compilazione segnala un warning: function returns address of local variable [enabled by default]|
#include <stdio.h>
#include <string.h>
char* str();
int main (){
char *p;
p=str();
printf ("Contenuto di p -> [ %s ]",p);
return 0;
}
char* str(){
char test[]="funzona";
return test;
}
Una cosa del tutto analoga è presente in questo topic (http://www.daniweb.com/software-development/c/threads/56000), ho provato il codice postato nell'ultima risposta, e funziona, 0Error 0Warning.
Sono in quella situazione in cui non vedo più i miei stessi errori, help :D
Come dice l'errore, la stringa che stai dichiarando è locale alla funzione, che verrà quindi cancellata una volta che ritorni nel main.
Devi allocare la stringa nella funzione con una malloc.
ciusss89
17-09-2011, 16:36
Come dice l'errore, la stringa che stai dichiarando è locale alla funzione, che verrà quindi cancellata una volta che ritorni nel main.
Devi allocare la stringa nella funzione con una malloc.
Grazie per l'illuminazione. :D Ora sto meglio.
#include <stdio.h>
#include <string.h>
char* str(char *);
int main (){
char scemo[]="COSI_TI_PIACE?";
char *p;
p=str(scemo);
printf ("Contenuto di p -> [ %s ]",p);
return 0;
}
char* str(char *scemo){
strcpy(scemo,"NO_COMMENT");
return scemo;
}
Grazie per l'illuminazione. :D Ora sto meglio.
#include <stdio.h>
#include <string.h>
char* str(char *);
int main (){
char scemo[]="COSI_TI_PIACE?";
char *p;
p=str(scemo);
printf ("Contenuto di p -> [ %s ]",p);
return 0;
}
char* str(char *scemo){
strcpy(scemo,"NO_COMMENT");
return scemo;
}
se passi la stringa per riferimento alla funzione e ci copi dentro una tua stringa con strcpy ( in realtà giochi con i puntatori ) è quasi inutile fare un return, per altro fai un return dello stesso puntatore che ti viene dato in ingresso, quindi non so a cosa possa servire.
Dovresti anche dichiarare la lunghezza di "scemo" tenendo in considerazione anche un carattere da dedicare al tappo "\0" perché così è un puntatore appeso in memoria che non si sa bene come sia allocato.
Dovresti anche dichiarare la lunghezza di "scemo" tenendo in considerazione anche un carattere da dedicare al tappo "\0" perché così è un puntatore appeso in memoria che non si sa bene come sia allocato.
Perchè? In quel caso viene allocato un array di char di strlen("COSI_TI_PIACE?") elementi più uno per il /0 finale.
ciusss89
19-09-2011, 14:16
Perchè? In quel caso viene allocato un array di char di strlen("COSI_TI_PIACE?") elementi più uno per il /0 finale.
...dovrebbe essere anche per me cosi, il terminatore dovrebbe essere "automaticamente incluso"..
Perchè? In quel caso viene allocato un array di char di strlen("COSI_TI_PIACE?") elementi più uno per il /0 finale.
e chi te lo dice?
e chi te lo dice?
Beh, gli string literals si comportano così:
In translation phase 7, a byte or code of value zero is appended to each multibyte
character sequence that results from a string literal or literals.66) The multibyte character
sequence is then used to initialize an array of static storage duration and length just
sufficient to contain the sequence.
Per di più nell'ultimo codice postato si sta sovrascrivendo uno string literals; cosa che porta ad un comportamente undefined.
Beh, gli string literals si comportano così:
Per di più nell'ultimo codice postato si sta sovrascrivendo uno string literals; cosa che porta ad un comportamente undefined.
ammesso che vada così, questo è quanto dovrebbe fare, non fai i conti con lo spazio riservato al puntatore alla sinistra di quella dichiarazione e ad altri eventuali dati in memoria, il C/C++ non ha un garbage collector, non puoi essere sicuro di fare cose del genere e farla franca nei confronti dei dati in memoria
ammesso che vada così, questo è quanto dovrebbe fare, non fai i conti con lo spazio riservato al puntatore alla sinistra di quella dichiarazione e ad altri eventuali dati in memoria, il C/C++ non ha un garbage collector, non puoi essere sicuro di fare cose del genere e farla franca nei confronti dei dati in memoria
Non "ammesso che vada così": funziona così. È lo standard a dirlo.
Secondariamente, quando scrivi "int a = 0;" hai problemi di memoria o necessità di intervento di un garbage collector? No.
Come dice GByte87, la lunghezza di quella stringa è nota a compile-time per cui non c'è alcun problema.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.