Dove nella memoria ci sono stringhe letterali? stack / heap?

Possibile duplicato:
C string letterali: dove vanno?

Per quanto ne so,

generalmente, il puntatore deve essere allocato da malloc () e verrà assegnato all’heap, quindi non allocato da free ();

e

non puntatore (int, char, float, ecc.) verranno assegnati automaticamente allo stack e non allocati fino a quando la funzione torna a ritornare

ma dal seguente codice:

#include  int main() { char *a; a = "tesaja"; return 0; } 

dove sarà assegnato? stack o heap?

La stringa letterale verrà allocata nel segmento di dati . Il puntatore ad esso, a , sarà assegnato nello stack.

Il tuo codice verrà trasformato dal compilatore in qualcosa del genere:

 #include  const static char literal_constant_34562[7] = {'t', 'e', 's', 'a', 'j', 'a', '\0'}; int main() { char *a; a = &literal_constant_34562[0]; return 0; } 

Pertanto, la risposta esatta alla tua domanda è: . Stack , dati , bss e heap sono tutte diverse regioni di memoria. Le variabili inizializzate di Const saranno nei dati .

a se stesso (il puntatore) viene definito come una variabile locale (implicitamente) utilizzando la class di memorizzazione auto , quindi viene allocata nello stack (o in qualsiasi altra memoria utilizzata dall’implementazione per l’allocazione stack-like – alcune macchine, come i mainframe IBM e il i primi Crays, non hanno uno “stack” nel senso normale).

La stringa letterale “tesaja” viene allocata staticamente. Esattamente dove ciò dipenderà dall’implementazione – alcuni lo metteranno insieme ad altri dati, e alcuni lo metteranno in un segmento di dati di sola lettura. Alcuni trattano tutti i dati come letti / scritti e tutti i codici come di sola lettura. Dal momento che vogliono che stringa letterale sia di sola lettura, lo inseriscono nel segmento di codice.