2013-04-15 12 views

risposta

16

Il codice sopra causerà problemi.

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

La stringa non deve 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.

cioè:

char strGlobal[10] = "Global"; 

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

Per sicurezza, si dovrebbe effettivamente allocare come un puntatore a dati const, cioè:

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 dinamica, che alloca la memoria sulla heap, non lo stack. La stringa può essere modificata senza problemi. A un certo punto, è necessario liberare questa memoria allocata dinamicamente 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 vengono segmentato per applicazioni in sistemi operativi moderni. Aumenterà davvero la tua comprensione di come viene costruito il tuo codice.

Riferimenti


  1. dati di settore, Accessed 2013/04/15, <http://en.wikipedia.org/wiki/Data_segment>
  2. Codice Segmento, cui si accede 2013/04/15, <http://en.wikipedia.org/wiki/Code_segment>
+2

Capito, grazie. – VishalDevgire

+1

Vorrei anche aggiungere una variante: 'char str [] =" Stack "' ... –

+0

@ValeriAtamaniouk E tu avresti ragione. Udpare. Grazie per avermi ricordato. I letterali delle stringhe – DevNull

2

Nel primo caso, il puntatore punta a un const char* che viene allocato nella parte sola lettura della memoria di processo.
Nel secondo caso, si assegna la memoria dinamicamente ed eventuall copia la stringa "Stack" nella memoria allocata.

È necessario liberare la memoria da II utilizzando free.

+0

E cosa succederà se provo a scrivere nell'area di sola lettura (primo caso)? – VishalDevgire

+1

Non è possibile, come è 'const char *' - una stringa costante. Il tuo compilatore ti impedirà di farlo. –

+1

Prego. Non è facile capire in primo luogo ... –

0

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

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

case II: è necessario un puntatore str che evidenzia una regione allocato dinamicamente (nel mucchio) il cui contenuto è "Stack", che è modificabile e deve essere liberata da invocking free(str) dopo l'uso.

Problemi correlati