|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
[C] Ritornare una stringa al chiamante.
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]| Codice:
#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, 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 ![]()
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ![]() Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5840
|
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. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
Quote:
![]() Codice:
#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; }
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ![]() Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Perchè? In quel caso viene allocato un array di char di strlen("COSI_TI_PIACE?") elementi più uno per il /0 finale.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
...dovrebbe essere anche per me cosi, il terminatore dovrebbe essere "automaticamente incluso"..
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ![]() Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. Ultima modifica di ciusss89 : 21-09-2011 alle 10:19. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Beh, gli string literals si comportano così:
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
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
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Secondariamente, quando scrivi "int a = 0;" hai problemi di memoria o necessità di intervento di un garbage collector? No.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12816
|
Come dice GByte87, la lunghezza di quella stringa è nota a compile-time per cui non c'è alcun problema.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:54.