diferencia c pointers stack char heap

diferencia - donde en memoria son literales de cadena? pila/montón?



heap vs stack diferencia (2)

Posible duplicado:
C Literales de cadena: ¿A dónde van?

por lo que sé,

en general, el puntero debe ser asignado por malloc (), y se asignará al montón, luego no asignado por free ();

y

no puntero (int, char, float, etc.) se asignará automáticamente a la pila, y sin asignar, siempre que la función vaya a regresar

pero, del siguiente código:

#include <stdio.h> int main() { char *a; a = "tesaja"; return 0; }

¿A dónde se asignará? pila o montón?


a sí mismo (el puntero) se define como una variable local (implícitamente) utilizando la clase de almacenamiento auto , por lo que se asigna en la pila (o cualquier memoria que la implementación use para la asignación similar a una pila; algunas máquinas, como los mainframes IBM y la primeros Crays, no tienen una "pila" en el sentido normal).

La cadena literal "tesaja" se asigna estáticamente. Exactamente dónde será eso depende de la implementación; algunos lo ponen con otros datos, y otros lo ubican en un segmento de datos de solo lectura. Algunos tratan todos los datos como de lectura / escritura y todos los códigos como de solo lectura. Como quieren que el literal de cadena sea de solo lectura, lo colocan en el segmento de código.


El literal de cadena se asignará en el segmento de datos . El puntero a él, a , se asignará en la pila.

Su código finalmente será transformado por el compilador en algo como esto:

#include <stdio.h> 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; }

Por lo tanto, la respuesta exacta a su pregunta es: ninguno . Stack , data , bss y heap son regiones diferentes de la memoria. Las variables iniciales de Const estarán en los datos .