2011-02-25 40 views
17

Cuando declaro un char * a una cuerda fija y volver a utilizar el puntero para señalar a otra cadenaadvertencia: la asignación crea un entero desde un puntero sin una conversión

/* initial declaration */ 
char *src = "abcdefghijklmnop"; 
..... 

/* I get the "warning: assignment makes integer from pointer without a cast" */ 
*src ="anotherstring"; 

Traté de refundir el puntero, pero sin éxito.

+3

Está en desuso en C para usar un 'char *' no const para apuntar a constantes de cadena - debe cambiar 'src' para que sea del tipo' const char * '. –

Respuesta

29

La expresión *src se refiere al primer carácter de la cadena, no toda la cadena. Para reasignar src para que apunte a una cadena diferente tgt, use src = tgt;.

0

Lo que dijo Jeremías, más el compilador emite la advertencia porque la producción:

*src ="anotherstring";

dice: tomar la dirección de "anotherstring" - "anotherstring" es un puntero char - y almacenar ese puntero indirecto a través src (* src = ...) en el primer carácter de la cadena "abcdef ..." La advertencia puede ser desconcertante porque no hay en ningún lugar en 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 diferencia cuándo emite la advertencia que está almacenando en un número entero. Lo cual, por cierto, está perfectamente bien y es legal, pero probablemente no sea exactamente lo que quiere en este código.

- Pete

+0

'int' y' char' normalmente no tienen el mismo número de bits. 'char' ha sido generalmente de 8 bits a lo largo de la historia de C, y' int' está garantizado para ser al menos 16 y es más probable que sea 32 o más. Ambos son tipos integrales, y por lo tanto "entero" podría significar cualquiera de ellos. Sin embargo, esto es un poco sorprendente cuando el "entero" al que se hace referencia es un "char". –

24

Cuando se escribe la declaración

*src = "anotherstring"; 

el compilador ve la cadena constante "abcdefghijklmnop" como una matriz. Imagine que ha escrito el siguiente código:

char otherstring[14] = "anotherstring"; 
... 
*src = otherstring; 

Ahora, está un poco más claro lo que está sucediendo. El lado izquierdo, *src, se refiere a char (ya que src es del tipo puntero-a-char) mientras que el lado derecho, otherstring, se refiere a un puntero.

Esto no es estrictamente prohibido, porque es posible que desee almacenar la dirección que un puntero apunta a. Sin embargo, normalmente se usa un lanzamiento explícito en ese caso (que no es demasiado común en un caso). El compilador está lanzando una bandera roja porque es probable que tu código no esté haciendo lo que crees que es.

Me parece que usted está tratando de asignar una cadena. Las cadenas en C no son tipos de datos como que están en C++ y en su lugar se implementan con las matrices char. No puede asignar valores directamente a una cadena como lo intenta hacer. En su lugar, es necesario utilizar funciones como strncpy y amigos de <string.h> y utilizar char matrices en lugar de char punteros. Si simplemente desea que el puntero apunte a una cadena estática diferente, entonces suelte el *.

4

La advertencia proviene del hecho de que estás dereferencing src en la asignación. La expresión *src tiene el tipo char, que es un tipo integral. La expresión "anotherstring" tiene tipo char [14], que en este contexto particular está implícitamente convertir 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.La caída de la * de *src, y debería funcionar como se esperaba:

src = "anotherstring"; 

ya que el tipo de src es char *.

Cuestiones relacionadas