|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2010
Messaggi: 67
|
[C/++] chiarimenti sulla copia di stringhe const
Salve a tutti.
Ho realizzato una banalissima classe che ha come variabile privata un const char *txt, in altre parole una stringa. Per gestire il valore di questa variabile mi sono inventato due metodi: Codice:
void addTxt( const char *txt ) {
_txt = txt;
}
void printTxt() {
printf( "%s\n", _txt );
}
Codice:
addTxt( "abcdef" ); Ora la parte poco chiara: non capisco come mai riesca a passare alla funzione anche un array di caratteri, il classico char str[xxx], senza che il compilatore si lamenti. L'assegnazione avviene senza problemi, se debuggo e stampo il "contenuto" di _txt all'interno di addTxt leggo la stringa voluta: ottengo invece spazzatura se chiamo printTxt. Sarei curioso di capire le dinamiche che avvengono nella scatolina nera, naturalmente ringraziando in anticipo per la vostra disponibilità. |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
char buffer[100] = "...."; [...] funzione(buffer); Codice:
funzione(&buffer[0]); Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2010
Messaggi: 67
|
Carissimo DanieleC88, prima di tutto ti ringrazio perchè la seconda parte della tua risposta è stata illuminante: in poche parole dovrei dimenticare l'allocazione statica del buffer char[...] e considerare quella dinamica, per risolvere il problema!
L'ho sparata grossa? Per quanto riguarda il primo esempio che hai riportato, vorrei capire meglio quanto segue: quale sarebbe il prototipo della funzione Codice:
funzione(&buffer[0]) |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
E comunque in realtà l'allocazione statica va benissimo, ma solo nei casi in cui non utilizzerai mai le variabili dopo che sono uscite dal loro contesto di visibilità. Ti faccio un esempio in codice: Codice:
#include <stdio.h>
int *salvato;
void salva_puntatore(int *riferimento)
{
salvato = riferimento;
}
void usa_puntatore()
{
(*salvato) = 10;
}
int main()
{
int x = 0;
salva_puntatore(&x);
usa_puntatore();
printf("x = %d;\n", x);
return 0;
}
Se invece avessi fatto una cosa del tipo: Codice:
#include <stdio.h>
int *salvato;
void salva_puntatore()
{
int x = 0;
salvato = &x;
}
void usa_puntatore()
{
(*salvato) = 10;
printf("salvato = %d;\n", (*salvato));
}
int main()
{
salva_puntatore();
usa_puntatore();
return 0;
}
Nota che questa è una regola generale, e vale anche per l'allocazione dinamica: le aree di memoria che allochi sono valide solo nell'intervallo di tempo tra una malloc() e una free(). Quote:
Codice:
[tipo] funzione([const] char *s); Codice:
[tipo] funzione([const] char s[]); Nota: con [tipo] voglio denotare un generico tipo di ritorno della funzione, mentre con [const] voglio indicare che può essere o non essere const, a seconda della tua scelta. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Apr 2010
Messaggi: 67
|
Chiarissimo, non ho davvero nulla da aggiungere. Per il "const" sono obbligato ad usarlo, poichè dichiarare char *c in c++ è considerato deprecated.
Questa discussione me la salvo! Grazie e alla prossima |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Ma visto che si parla di stringhe e C++ perchè non usare la classe string?
Questa discussione sta riguardando le stringhe C. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:12.




















