type - advertencia: la asignación crea un entero desde el puntero sin una conversión
type casting c++ (4)
Cuando declaro un char *
a una cadena fija y reutilizo el puntero para apuntar a otra cadena
/* initial declaration */
char *src = "abcdefghijklmnop";
.....
/* I get the "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";
Intenté refundir el puntero pero no tuve éxito.
Cuando escribes el enunciado
*src = "anotherstring";
el compilador ve la cadena constante "abcdefghijklmnop"
como una matriz. Imagina que has escrito el siguiente código en su lugar:
char otherstring[14] = "anotherstring";
...
*src = otherstring;
Ahora, es un poco más claro lo que está pasando. El lado izquierdo, *src
, se refiere a un char
(ya que src
es de tipo puntero a char
) mientras que el lado derecho, otherstring
, se refiere a un puntero.
Esto no está estrictamente prohibido porque es posible que desee almacenar la dirección a la que apunta un puntero. Sin embargo, normalmente se usa una conversión explícita en ese caso (que no es un caso muy común). El compilador está lanzando una bandera roja porque su código probablemente no está haciendo lo que usted cree que es.
Me parece que estás tratando de asignar una cadena. Las cadenas en C no son tipos de datos como en C ++ y en su lugar se implementan con matrices de caracteres. No puedes asignar valores directamente a una cadena como lo intentas hacer. En su lugar, debe usar funciones como strncpy
y amigos de <string.h>
y usar matrices de caracteres en lugar de punteros de caracteres. Si simplemente desea que el puntero apunte a una cadena estática diferente, suelte el *
.
La advertencia proviene del hecho de que no está haciendo referencia a la fuente en la tarea. La expresión *src
tiene el tipo char
, que es un tipo integral. La expresión "anotherstring"
tiene el tipo char [14]
, que en este contexto particular se convierte implícitamente al tipo char *
, y su valor es la dirección del primer carácter de la matriz. Entonces, terminas tratando de asignar un valor de puntero a un tipo integral, de ahí la advertencia. Suelte el *
de *src
, y debería funcionar como se esperaba:
src = "anotherstring";
ya que el tipo de src
es char *
.
La expresión *src
refiere al primer carácter de la cadena, no a toda la cadena. Para reasignar src
para que apunte a una cadena diferente tgt
, use src = tgt;
.
Lo que dijo Jeremías, más el compilador emite la advertencia porque la producción:
*src ="anotherstring";
dice: tome la dirección de "anotherstring" - "anotherstring" ES un puntero de carácter - y guárdelo indirectamente a través de src (* src = ...) en el primer carácter de la cadena "abcdef ..." La advertencia podría ser desconcertante porque no hay en ninguna parte de su código ninguna mención de ningún número entero: la advertencia parece absurda. Pero, fuera de la vista detrás de la cortina, está la regla de que "int" y "char" son sinónimos en términos de almacenamiento: ambos ocupan el mismo número de bits. El compilador no se diferencia cuando emite la advertencia de que está almacenando en un entero. Lo que, por cierto, es perfectamente correcto y legal, pero probablemente no es exactamente lo que desea en este código.
pete