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
- dati di settore, Accessed 2013/04/15,
<http://en.wikipedia.org/wiki/Data_segment>
- Codice Segmento, cui si accede 2013/04/15,
<http://en.wikipedia.org/wiki/Code_segment>
Capito, grazie. – VishalDevgire
Vorrei anche aggiungere una variante: 'char str [] =" Stack "' ... –
@ValeriAtamaniouk E tu avresti ragione. Udpare. Grazie per avermi ricordato. I letterali delle stringhe – DevNull