Newsgroup: it.comp.lang.c++
Titolo: rappresentazione interna delle stringhe

Ciao a tutti,
  ho trovato in rete un esempio di un programma che fa l'assunzione che 
il contenuto di una std::string sia allocato in locazioni di memoria 
contigue. Qualcuno sa se questo e' garantito dallo standard o meno?
So che questo vale sicuramente per std::vector, ma non sono sicuro che 
sia cosi' per std::vector.
In altre parole questo programma e' corretto o funziona per caso?
#include <cstring>
#include <string>
#include <iostream>
int main() {
     std::string pippo;
     char* cstr = "ciao mondo";
     pippo.resize(10);
     std::strncpy(&pippo[0],cstr,10);
     std::cout << pippo<<std::endl;
}

 }
;-) provare non costa nulla.... dopo me lo compilo-eseguo.
Comuqnue interessante da un punto di vista impementativo sono curioso 
anche io.
Io sarei ottimista...qualcuno sa se sta roba funzia per certo?

 }
Il programma non e' corretto perche' la std::string non ha il 
terminatore '\0' alla fine, quindi ha effettivamente spazio per 10 
caratteri.
Non vorrei sbagliare, ma mi sembra che strcpy appenda alla fine anche il 
carattere terminatore.
Per sicurezza fai
	pippo.resize(10)
Saluti  Manlio Perillo

paroparo wrote:

IMHO non è corretto, non sei poi sicuro che il metodo size() restituisca 
il valore corretto (non è detto che size() sia implementato 
internalmente con una strlen())
-- 
Quanto sai di te stesso se non ti sei mai battuto?

 contigue. Qualcuno sa se questo e' garantito dallo standard o meno?
Non mi pare che sia garantito dallo Standard del '98, né dalle modifiche 
introdotte nel 2003.
Il fatto che data() e c_str() restituiscano un array non implica tale 
garanzia, in quanto  queste funzioni possono effettuare un'allocazione 
apposita. 
Inoltre, lo Standard non stabilisce delle limitazioni di complessità per 
implementazione di std::string, perciò in linea di principio anche 
l'implementazione più stravagante può essere conforme.
Ciò detto, non conosco implementazione in cui non valga sempre
  &str[0] == str.data() ( per str.size() > 0 )
Per inciso, se vuoi un esempio di classe simil-std::string che non soddisfa 
il presupposto del programma in questione, puoi dare uno sguardo a 
http://www.sgi.com/tech/stl/Rope.html
.
In conclusione, direi che molto probabilmente il tuo programma funzionerà 
senza problema alcuno in tutti gli ambienti possibili escluso quello in 
cui lo dovrai mettere in produzione. :)
Max

 
E' proprio quello che temevo...
Peccato, perche' avrebbe fatto comodo in tutti quei casi in cui devo 
usare una funzione c che chiede un buffer di char da riempire.
Se fossi sicuro che quel trucco funziona potrei ogni volta evitare di 
allocare un array di char,invocare la funzione,  copiare il risultato 
nella stringa, deallocare l'array.
Qualcuno conosce qualche metodo furbo alternativo?
Ciao e grazie,
Tommaso

 
Ho usato strncpy (nota la n), quindi ho copiato solo 10 caratteri, senza 
terminatore.
Grazie per la risposta

 Qualcuno conosce qualche metodo furbo alternativo?
ma certo: uno std::vector<char>
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 
E' vero ma visto che mi serve una std::string cambia solo che dovrei 
usare un std::vector<char> come appoggio invece di un char[]...
Il mio dubbio nasce dal fatto che in questo codice
http://www.roguewave.com/support/docs/sourcepro/stdlibref/codecvt.html#sec12
viene fatta quella assunzione che dicevo nel post originale  nelle 
chiamate a 
cdcvt.in
(...) e cdcvt.out(...)
Il sito mi sembra affidabile e non segnala la cosa come un'estensione 
del compilatore, per cui mi era venuto il dubbio che lo standard desse 
qualche garanzia in tal senso, ma a quanto pare non e' cosi`.
Ciao