Porque me sale inicializar ‘char *’ con una expresión de tipo ‘const char *’ descarta los calificadores?

No puedo entender por qué recibí esta advertencia de clang por mi cuenta:

 function_prototype_const_modifier.c:13:8: warning: initializing 'char *' with an expression of type 'const char *' discards qualifiers [-Wincompatible-pointer-types] char *ptr1 = source; ^ ~~~~~~ 1 warning generated. 

El código es muy simple

 #include char *my_strcpy(char *destination, const char *source); int main(void) { char str1[] = "this is something"; char str2[] = "123456789123456789"; my_strcpy(str2, str1); puts(str2); return 0; } char *my_strcpy(char *destination, const char *source) { char *ptr1 = source; char *ptr2 = destination; while(*ptr1 != '\0') { *ptr2++ = *ptr1++; } *ptr2 = '\0'; return destination; } 

¿alguna idea?

source es una const char * , un puntero a const caracteres, por lo que los caracteres no se pueden cambiar mediante la desreferenciación del puntero (es decir, source[0] = 'A'; es una infracción de restricción).

Sin embargo, asignarlo a un char * descarta esta restricción; un simple char * sugiere que los caracteres apuntados por el puntero ptr1 no son constantes y ahora puede escribir libremente ptr1[0] = 'A'; sin obtener errores de comstackción (un “mensaje de diagnóstico”).

Considera lo que esto significa cuando pasas una cadena literal. Como un literal de cadena es “solo lectura” (es un const char [] ), tratar de modificar su contenido es un comportamiento indefinido. Así que si llamas

 my_strcpy(destination, "Constant String"); 

pero en el código por alguna razón escribes

 ptr1[0] = 'A'; 

no recibirá un mensaje de diagnóstico del comstackdor porque ptr1 es un puntero a caracteres no constantes, pero su progtwig aún invocará un comportamiento indefinido (y en la práctica, lo más probable es que se bloquee, ya que los literales de cadena se colocan en regiones de memoria de solo lectura).

Solo necesitas cambiar:

 char *ptr1 = source; 

a:

 const char *ptr1 = source; 

Porque el tipo de LHS es char * y el tipo de RHS es const char * .

La razón es exactamente como dice el error:

function_prototype_const_modifier.c: 13: 8: advertencia: inicializar ‘char *’ con una expresión de tipo ‘const char *’ descarta los calificadores

La statement le permite descartar el calificador const y le permite modificar la cadena puntiaguda a través de ptr1 y ptr2 y, por lo tanto, el comstackdor se queja.

Está apuntando a la misma área en la memoria, pero no la está calificando como const , lo que es el argumento.

A continuación, permite que el cuerpo de la función modifique la parte de la memoria que está etiquetada como const .

Está asignando un puntero a una constante de carácter a un puntero a un carácter. Al hacer eso, te arriesgas a modificar el personaje (s) .

En este caso, casi todo lo que podemos hacer.

Gracias de la información clara para @ user529758.

Sólo más una respuesta.

Modificado:

 #include char *my_strcpy(char *destination, const char *source); int main(void) { char str1[] = "this is something"; char str2[] = "123456789123456789"; my_strcpy(str2, str1); puts(str2); return 0; } char *my_strcpy(char *destination, const char *source) { char *ptr1 = (char*)source; char *ptr2 = destination; while(*ptr1 != '\0') { *ptr2++ = *ptr1++; } *ptr2 = '\0'; return destination; }