2010-02-24 25 views

Respuesta

22

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

const char * x = "hello world"; 
+1

+1. Dudo que incluso compile sin el calificador const. –

+8

@BillyONeal: Sí. – missingfaktor

+0

Recuerdo vagamente los perfiles de compilador de oldschool C que se rehúsan a compilar sin 'const'. –

7

La cadena se almacena en el área de datos del programa. Esto es completamente compilador, 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 compilando para una plataforma incrustada, estos datos podrían almacenarse en ROM en lugar de en RAM.

He aquí un ejemplo de la disposición del formato ELF:

ELF Layout

Sus datos de cadena lo más probable encontrar en las .data o .text secciones, dependiendo del compilador.

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.

+0

El formato ejecutable no define cómo se almacenan los literales de cadena. –

+0

Es absolutamente. Varios estándares ejecutables especifican dónde colocar los datos estáticos en el archivo. –

+0

Hmm .. No estoy al tanto de ninguno. ELF, PE y NE ciertamente no. Los formatos PE y ELF proporcionan una instalación de una tabla de cadenas para fines de localización, pero las constantes de cadenas no se ponen (generalmente) allí porque ese no es su propósito. –

1

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 programa. En general, puede tratarlo como una variable de constante estática global, excepto que no es accesible fuera de su función.

3

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

+0

+ !. Violación de acceso, ¿alguien? :) EDITAR: ¡Eso es +1! Maldición tecla shift ... –

5

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

Realizar operaciones como c[0] = 'k' etc. invoca un comportamiento no definido.

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

Sí!

6

§2.14.15 literales de cadena, Sección 7

Una cadena estrecha literal tiene que escribir “matriz de n const char”, donde n es el tamaño de la cadena como se define a continuación, y tiene almacenamiento estático duración.

-3

Ha pasado un tiempo desde que jugué con C++, pero recuerdo que (autodidacta) tenía un montón de problemas con las cadenas (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; 

Martin

+0

Debe hacer coincidir 'new []' con 'delete []', not 'delete'. O simplemente use 'std :: string'. – fredoverflow

+0

Mi mal entonces - no recuerdo haber tenido que hacerlo ... Por otra parte, C++ fue hace mucho tiempo para mí - Borland Turbo C++ para MSDOS ... –

+0

Algunos compiladores lo hacen bien sin los corchetes añadidos a ' delete', pero no confiaría en eso. –

0

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

e.g char * str = "hello";

str es el puntero de 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, la cadena literal crea una copia de la cadena en la pila.

i.e char str [] = "hello";

"hello" se copia a la pila (anexado por el carácter nulo) y str apunta al carácter 'h' en la pila.

Cuestiones relacionadas