Questo è generalmente non sicuro, indipendentemente dal fatto che la sequenza di stringhe interna sia archiviata in memoria in modo continuo o meno. Potrebbero esserci molti altri dettagli di implementazione relativi al modo in cui la sequenza controllata viene archiviata dall'oggetto std::string
, oltre alla continuità.
Un vero problema pratico potrebbe essere il seguente. La sequenza controllata di std::string
non deve essere memorizzata come stringa a terminazione zero. Tuttavia, in pratica, molte (la maggior parte?) Implementazioni scelgono di sovradimensionare il buffer interno di 1 e memorizzano comunque la sequenza come una stringa a terminazione zero perché semplifica l'implementazione del metodo c_str()
: basta restituire un puntatore al buffer interno e si fatto.
Il codice indicato nella domanda non fa alcuno sforzo per terminare a zero i dati copiati nel buffer interno. Molto probabilmente semplicemente non sa se è necessaria la terminazione zero in questa implementazione di std::string
. Molto probabilmente si basa sul buffer interno riempito di zeri dopo la chiamata a resize
, quindi il carattere extra assegnato per lo zero-terminator dall'implementazione è convenientemente preimpostato su zero. Tutto questo è dettaglio di implementazione, il che significa che questa tecnica dipende da alcune ipotesi piuttosto fragili.
In altre parole, in alcune implementazioni probabilmente dovresti usare strcpy
, non memcpy
per forzare i dati nella sequenza controllata del genere. Mentre in alcune altre implementazioni dovresti usare memcpy
e non strcpy
.
L'uso di & s [0] è OK, memcpy() probabilmente meno. Perché non eseguire semplicemente un compito o utilizzare la funzione membro assign() della stringa? –
@Neil Butterworth, questo è quello che mi sto chiedendo guardando questo codice ...;) – paxos1977
Man mano che acquisisci esperienza nella programmazione in C++, ti asterrai sempre più dall'uso di 'memset' e' memcpy', e imparerai il ragionamento Questo è uno da aggiungere alla tua esperienza. –