En C, podemos usar char * para señalar una cadena. Al igual que
char *s = "Hello";
.
Como puede verse, ni la variable se ubica dinámicamente en el montón porque no hay funciones dinámicas como malloc, ni está definida para señalar otra variable determinada.
Entonces mi pregunta es, ¿dónde está almacenada lógicamente la cadena literal a la que apunta la variable [char *s]?
¿Se almacena en la pila como cualquier variable local normal? o, algo así como pila?
En realidad, soy un graduado del departamento de ingeniería informática, pero no he encontrado y he tenido demasiada curiosidad acerca de cómo [char * string] funciona lógicamente. Es un gran honor preguntar justo ahora.
La variable char* s
se almacena en la pila, asumiendo que se declara en el cuerpo de una función. Si se declara en una clase, entonces se almacena donde se almacena el objeto de la clase. Si se declara como global, entonces se almacena en la memoria global.
De hecho, cualquier variable no static
y no thread_local
que declare en estas tres posiciones se comporta de la misma manera, independientemente de si es una primitiva (es decir, int
), un objeto (es decir, vector<int>
) o un puntero (es decir, const char*
). Si una variable es estática, siempre se almacena en el espacio global. Si una variable es thread_local
, cada hilo obtiene su propia copia, y esa copia generalmente se almacenará en la base de la pila para el hilo correspondiente.
La cadena real "Hello"
, a la que apunta s
, se almacena en un espacio global constante en algún lugar, generalmente el segmento .data
.
Los literales de cadena tienen una duración de almacenamiento estática . Eso significa que existen durante toda la vida útil de su programa. Pueden almacenarse en un área no escribible y pueden superponerse con otros literales de cadena. Dos instancias diferentes del mismo literal pueden o no coincidir.
Depende de su implementación (compilador/enlazador/etc). para tomar una decisión que cumpla con esos requisitos.
No hay nada especial en s
, es un puntero, apunta a alguna parte. Tiene duración de almacenamiento automático como cualquier otra variable local no declarada static
. Sin embargo, lo que es "especial" es el literal de cadena al que está apuntando.
Puede pensar en un literal de cadena como "foo"
como una variable global sin nombre con algunas restricciones especiales. Estas restricciones son:
const