Almacenamiento de tipo de datos literal de cadena C ++

void f() { char *c = "Hello World!" } 

Donde esta la cuerda almacenada? ¿Cuál es la propiedad de eso? Solo sé que es una constante, ¿qué más? ¿Puedo devolverlo desde el interior del cuerpo de la función?

está empaquetado con su binario – por paquete quiero decir cableado, así que sí, puede devolverlo y usarlo en otro lugar – sin embargo, no podrá modificarlo, y le sugiero que lo declare como:

 const char * x = "hello world"; 

La cadena se almacena en el área de datos del progtwig. Esto es completamente comstackdor, formato ejecutable y plataforma dependiente. Por ejemplo, un binario ELF coloca esto en una ubicación diferente a la de un ejecutable de Windows, y si estaba comstackndo para una plataforma incrustada, estos datos podrían almacenarse en ROM en lugar de en RAM.

Aquí hay una ilustración del diseño del formato ELF:

Diseño ELF

Es probable que los datos de su cadena se encuentren en las secciones .data o .text , según el comstackdor.

Sin duda puede devolverlo desde el interior del cuerpo de la función. Simplemente consulte con su implementación para verificar que sea de acceso aleatorio, ya que muchas implementaciones no le permitirán sobrescribirlo.

§2.14.15 Literales de cadenas, Sección 7

Un literal de cadena estrecha tiene el tipo “array of n const char”, donde n es el tamaño de la cadena como se define a continuación, y tiene una duración de almacenamiento estática .

Generalmente se almacena en la sección de solo lectura de la memoria y tiene una asignación de almacenamiento estática.

La realización de operaciones como c[0] = 'k' etc. invoca Comportamiento no definido.

¿Puedo devolverlo desde el interior del cuerpo de la función?

¡Sí!

Tiene una duración de almacenamiento estático, por lo que existe durante toda la vida del progtwig. Exactamente donde el comstackdor / vinculador pone los datos inicializados varía. Devolverle un puntero desde una función está bien, pero asegúrese de devolver una char const * , escribir en la cadena provoca un comportamiento indefinido.

Su implementación está definida. La mayor parte del tiempo se almacenaría en una tabla de cadenas con todas las otras cadenas de su progtwig. En general, puede tratarlo como una variable de constante estática global, excepto que no es accesible fuera de su función.

Los literales de cadena se almacenan en el segmento de DATOS y se asignan en tiempo de comstackción. Esto ayuda a asignar los mismos literales de cadena a múltiples variables sin crear copias de cadena.

por ejemplo, char * str = “hola”;

El str es el puntero char, que tiene la dirección de char h, mientras que “hello” se almacena en el segmento de datos y no se puede modificar. Intentar modificarlo generará una falla de segmentación.

Al asignar una cadena de caracteres, el literal de cadena crea una copia de cadena en la stack.

es decir, char str [] = “hola”;

“hello” se copia a la stack (anexa por el carácter nulo) y str apunta al carácter “h” en la stack.

Ha pasado un tiempo desde que jugué con C ++, pero recuerdo que (autodidacta) tenía muchos problemas con las cuerdas (bueno, vale, arreglos de caracteres …).

Si va a modificar su valor, asegúrese de usar las palabras clave nuevas y eliminar … Algo así …

 char *strText = new char[10]; /* Do something ... ... ... */ delete [] strText; 

Martín