Un valor de tipo “const char*” no se puede utilizar para inicializar una entidad de tipo “char *”

3 minutos de lectura

avatar de usuario
nTIAO

Tengo un código como este pero sigo recibiendo este error:

A value of type "const char*" cannot be used to initialize an entity of type "char *"

¿Qué está pasando?
He leído los siguientes hilos, pero no he podido ver ningún resultado en mi respuesta, ya que todos son de char a char* o char* a char:
El tipo de valor const char no se puede usar para inicializar una entidad de tipo char*
El valor de tipo char* no se puede usar para inicializar una entidad de tipo “char”

#include <iostream>;
using namespace std;

int main() {
    int x = 0; //variable x created
    int cars (14);//cars is created as a variable with value 14
    int debt{ -1000 };//debt created with value 1000
    float cash = 2.32;
    double credit = 32.32;
    char a="a";//for char you must use a single quote and not double
    char* sandwich = "ham";
    return 0;
}

Estoy usando Visual Studio Community 2017

  • const char* sandwich = "ham";

    usuario9212993

    13 de febrero de 2018 a las 4:41

  • ¿Qué parte del mensaje de error no entiendes? significa que la inicialización (es decir, el lado derecho de su expresión) tiene tipo const char* mientras que usted declaró un char*. Simplemente modifique el tipo declarado como decía

    – phuclv

    13 de febrero de 2018 a las 4:50


  • Posible duplicado de ¿Por qué la conversión de cadena constante a ‘char*’ es válida en C pero no válida en C++?

    – xskxzr

    13 de febrero de 2018 a las 5:01

  • Esta es una pregunta para principiantes, pero no es una mala pregunta. El hecho de que int Es para const int como char* Es para char* constno const char*no es obvio.

    – Davislor

    13 de febrero de 2018 a las 5:01

  • Para que el OP sepa, debe evitar “arreglarlo” de esta manera. char *sandwich = (char *)"ham"; Esto funciona solo debido a la compatibilidad con versiones anteriores de C y está descartando la seguridad de tipos sin ningún motivo.

    –Justin Randall

    13 de febrero de 2018 a las 5:05

avatar de usuario
Davislor

Eso es correcto. Digamos que tienes el siguiente código:

const char hello[] = "hello, world!";
char* jello = hello; // Not allowed, because:
jello[0] = 'J'; // Undefined behavior!

¡Vaya! A const char* es un puntero no constante a const char. Si asigna su valor a una no constante char*has perdido su const propiedad.

A const puntero a no constante char seria un char* consty puede inicializar un char* de eso todo el día si quieres.

Puedes, si realmente quieres, lograr esto con const_cast<char*>(p), y ocasionalmente lo he hecho, pero generalmente es un signo de un defecto de diseño grave. Si realmente hace que el compilador emita instrucciones para escribir en la memoria con un alias de una constante de cadena, obtiene un comportamiento indefinido. Una de las muchas cosas que puede que salir mal es que algunas implementaciones almacenarán la constante en la memoria de solo lectura y fallarán. O los mismos bytes de memoria pueden reutilizarse para más de un propósito, porque después de todo, le advertimos que nunca la cambie.

Por cierto, las reglas en C son diferentes. Esto es únicamente por compatibilidad con versiones anteriores de C que no tenían la const palabra clave, y nunca debe escribir código nuevo que use un alias que no sea constante para una constante de cadena.

Necesitas hacer que tu cadena sea de tipo literal const porque en C++ es una matriz constante de chara diferencia de C, donde es solo una matriz de char. No puede cambiar un literal de cadena, por lo que lo hace const se prefiere en C++ para mayor seguridad. Es la misma razón por la que tienes que usar un reparto explícito al pasar de const char* a char*. Todavía está técnicamente “permitido” en C ++, ya que está permitido en C, por lo que es solo una advertencia. Todavía es una mala práctica hacerlo. Para corregir la advertencia, hágala const.

const char* sandwich = "ham";

  • Bien explicado.

    – Amal lal TL

    17 de julio de 2021 a las 13:51

¿Ha sido útil esta solución?