programas funciones ejemplos comandos codigos caracteristicas basicos c++ c c-strings

funciones - ejemplos de programas en c++ pdf



¿Es malo declarar una cadena de estilo C sin constante? Si es así, ¿por qué? (8)

Hacer esto en C ++

char* cool = "cool";

compila bien, pero me da una advertencia:

conversión obsoleta de constante de cadena a char *.

Nunca usaría voluntariamente una cadena de estilo C sobre std::string , pero por si acaso me hacen esta pregunta:

¿Es una mala práctica declarar una cadena de estilo C sin el modificador const ? Si es así, ¿por qué?


char * cool = "cool"

"cool" se almacenará en un bloque de solo lectura (generalmente en el segmento de datos) que se comparte entre las funciones. Si intenta modificar la cadena "cool" por el punto cool, obtendrá un error como un error de segmento cuando el programa se esté ejecutando. Si usa const char* cool = "cool" , obtendrá un error al compilar si intenta modificar la cadena.
Puede leer esta página para obtener más información http://www.geeksforgeeks.org/storage-for-strings-in-c/


Es malo porque las constantes de cadena pueden estar contenidas solo una vez por binario (palabra clave: stringtable, .strtab ). Ej. En

char *cool = "cool"; char *nothot = "cool";

ambas variables pueden apuntar a la misma ubicación de memoria. Modificar el contenido de uno de ellos también podría alterar el otro, de modo que después

strcpy(nothot, "warm");

tu cool vuelve "cálida".

En resumen, es un comportamiento indefinido.


Es malo. Es muy malo. Hasta el punto, esto ya no es posible hacerlo en C ++ 11.

Modificar la memoria de un literal de cadena es un comportamiento indefinido.


Es un literal de cadena, por lo tanto, debe ser constante ya que la memoria podría estar ubicada en la sección de solo lectura. Si tienes char cool[] = "cool"; entonces no es un problema, la memoria es tuya.


Es una buena práctica escribir const para cadenas (especialmente cuando usó un literal de cadena) pero en C apenas hace la diferencia, le arrojará una advertencia en c ++ pero ninguna advertencia en c, también recuerde que algunos compiladores asumen la extensión .c simplemente como c pero .C como c ++, así que tenga cuidado en tales puntos. de lo contrario, es una buena práctica usar const con el caso de las cadenas, por lo que, por error, no cambia la cadena ni intenta cambiar un literal de cadena que está almacenado en memoria de solo lectura.


Primero, char* cool = "cool"; No es estándar C ++. Un literal de cadena tiene el tipo de const char[n] . Entonces, la línea de código anterior rompe la corrección constante y no debe compilarse. Algunos compiladores como GCC permiten esto, pero emiten una advertencia ya que es una retención de C. MSVC emitirá un error ya que es un error.

Segundo, ¿por qué no dejar que el compilador trabaje para usted? Si está marcado const , obtendrá un buen error de compilación si accidentalmente intenta modificarlo. Si no lo hace, puede obtener un error de tiempo de ejecución realmente desagradable que puede ser mucho más difícil de encontrar.


Sí, en C ++ siempre debe referirse a literales de cadena con variables de tipo const char * o const char [N] . Esta también es la mejor práctica al escribir un nuevo código C.

Los literales de cadena se almacenan en la memoria de solo lectura, cuando esto es posible; su tipo está debidamente calificado. C, pero no C ++, incluye una verruga de compatibilidad con versiones anteriores donde el compilador les da el tipo char [N] aunque estén almacenados en la memoria de solo lectura. Esto se debe a que los literales de cadena son más antiguos que el calificador const . const fue inventado en el período previo a lo que ahora se llama "C89": la forma anterior del lenguaje "K&R" no lo tenía.

Algunos compiladores de C incluyen un modo opcional en el que la verruga de compatibilidad con versiones anteriores está deshabilitada, y char *foo = "..."; le dará el mismo diagnóstico o un diagnóstico similar al que tiene en C ++. GCC deletrea este modo -Wwrite-strings . Lo recomiendo para el nuevo código; sin embargo, activarlo para el código antiguo puede requerir una gran cantidad de trabajo por muy poco beneficio.


Sí, esta declaración es una mala práctica, ya que permite muchas formas de provocar accidentalmente Comportamiento indefinido escribiendo en un literal de cadena, que incluye:

cool[0] = ''k''; strcpy(cool, "oops");

Por otro lado, esto está perfectamente bien, ya que asigna una serie de caracteres no constantes:

char cool[] = "cool";