
Chris Cooper
Estoy interesado en saber dónde se asignan/almacenan los literales de cadena.
Encontré una respuesta intrigante aquí, diciendo:
La definición de una cadena en línea en realidad incrusta los datos en el propio programa y no se puede cambiar (algunos compiladores permiten esto mediante un truco inteligente, no se moleste).
Pero tenía que ver con C ++, sin mencionar que dice que no se moleste.
estoy molestando =D
Entonces, mi pregunta es ¿dónde y cómo se guarda mi literal de cadena? ¿Por qué no debería intentar alterarlo? ¿La implementación varía según la plataforma? ¿Alguien quiere dar más detalles sobre el “truco inteligente”?

Samuel Klatchko
Una técnica común es que los literales de cadena se coloquen en la sección “datos de solo lectura” que se asignan al espacio del proceso como de solo lectura (razón por la cual no puede cambiarlo).
Varía según la plataforma. Por ejemplo, es posible que las arquitecturas de chips más simples no admitan segmentos de memoria de solo lectura, por lo que el segmento de datos se podrá escribir.
En lugar de intentar encontrar un truco para hacer que los literales de cadena se puedan cambiar (dependerá en gran medida de su plataforma y podría cambiar con el tiempo), simplemente use matrices:
char foo[] = "...";
El compilador hará los arreglos para que la matriz se inicialice desde el literal y usted puede modificar la matriz.
No hay una respuesta para esto. Los estándares de C y C++ simplemente dicen que los literales de cadena tienen una duración de almacenamiento estática, cualquier intento de modificarlos genera un comportamiento indefinido y varios literales de cadena con el mismo contenido pueden o no compartir el mismo almacenamiento.
Según el sistema para el que esté escribiendo y las capacidades del formato de archivo ejecutable que utiliza, pueden almacenarse junto con el código del programa en el segmento de texto, o pueden tener un segmento separado para los datos inicializados.
La determinación de los detalles también variará según la plataforma; lo más probable es que incluya herramientas que puedan decirle dónde lo está colocando. Algunos incluso le darán control sobre detalles como ese, si lo desea (p. ej., gnu ld le permite proporcionar un script para contarlo todo sobre cómo agrupar datos, codificar, etc.)

grijesh chauhan
FYI, solo respaldando las otras respuestas:
El estandar: ISO/CEI 14882:2003 dice:
2.13. Literales de cadena
-
[…]Un literal de cadena ordinario tiene el tipo “matriz de n const char
” y duración del almacenamiento estático (3.7)
-
Si todos los literales de cadena son distintos (es decir, se almacenan en objetos que no se superponen) está definido por la implementación. El efecto de intentar modificar un literal de cadena no está definido.

alex budovski
gcc hace un .rodata
sección que se asigna “en algún lugar” en el espacio de direcciones y se marca como de solo lectura,
Visual C++ (cl.exe
) hace un .rdata
sección con el mismo propósito.
Puedes mirar la salida de dumpbin
o objdump
(en Linux) para ver las secciones de su ejecutable.
P.ej
>dumpbin vec1.exe
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file vec1.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
5000 .rdata <-- here are strings and other read-only stuff.
14000 .text