Differenza tra stringa dichiarata e stringa allocata

I. char *str = "Stack"; II. char *str = (char*) malloc(6); strcpy(str, "Stack"); 

Quali sono le differenze tra i due precedenti approcci?

Sono uguali o qualcosa di diverso dietro le tende?

Il codice sopra causerà problemi.

La prima istanza è nota come allocazione e definizione di stringhe statiche. Per le variabili normali come int , etc e tipi di dati non stringa, tale dichiarazione alloca i dati nello stack. Nel caso di stringhe inizializzate tramite string letterali (es .: "stack" ), viene allocata in una porzione di memoria di sola lettura.

La stringa stessa non dovrebbe essere modificata, in quanto verrà memorizzata in una porzione di memoria di sola lettura. Il puntatore stesso può essere cambiato per puntare a una nuova posizione.

vale a dire:

 char strGlobal[10] = "Global"; int main(void) { char* str = "Stack"; char* st2 = "NewStack"; str = str2; // OK strcpy(str, str2); // Will crash } 

Per sicurezza, dovresti allocare effettivamente un puntatore ai dati const, ovvero:

 const char* str = "Stack"; // Same effect as char* str, but the compiler // now provides additional warnings against doing something dangerous 

Il secondo è noto come allocazione dynamic, che alloca la memoria sull’heap, non sullo stack. La stringa può essere modificata senza problemi. Ad un certo punto, è necessario liberare questa memoria allocata dynamicmente tramite il comando free() .

C’è un terzo mezzo per allocare una stringa, che è l’allocazione statica nello stack. Ciò consente di modificare il contenuto dell’array che contiene la stringa ed è assegnato staticamente.

 char str[] = "Stack"; 

In sintesi:

 Example: Allocation Type: Read/Write: Storage Location: ================================================================================ const char* str = "Stack"; Static Read-only Code segment char* str = "Stack"; Static Read-only Code segment char* str = malloc(...); Dynamic Read-write Heap char str[] = "Stack"; Static Read-write Stack char strGlobal[10] = "Global"; Static Read-write Data Segment (R/W) 

Si dovrebbe anche leggere su come i dati sono segmentati per le applicazioni nei moderni sistemi operativi. Aumenterà davvero la tua comprensione di come viene costruito il tuo codice.

Riferimenti


  1. Segmento dati , accesso 2013-04-15,
  2. Segmento di codice , accesso 2013-04-15,

Nel primo caso, il puntatore punta a un const char* che viene allocato nella parte di sola lettura della memoria di processo.
Nel secondo caso, si sta allocando la memoria dynamicmente e eventuall copia la stringa “Stack” nella memoria allocata.

È necessario alla fine liberare la memoria da II utilizzando free .

Dimentica le altre risposte che sostengono qualsiasi cosa sull’archiviazione all’interno di stack poiché non sono corrette. (Oooh ora quelle risposte sono state rimosse ..)

case I: si ha un puntatore str che punta a una regione di memoria di sola lettura (la sezione .rodata ) il cui contenuto è "Stack" .

case II: si ha un puntatore str che punta ad una regione allocata dynamicmente (nell’heap) il cui contenuto è "Stack" , che è modificabile e deve essere liberato invocando free(str) dopo averlo usato.