Posible duplicado:
¿Por qué sizeof (param_array) es el tamaño del puntero?
Soy nuevo en C, recibí una advertencia de clang
al comstackr mi código:
#include char *strcpy (char destination[],const char source[]); int main(void) { char str1[] = "this is a very long string"; char str2[] = "this is a short string"; strcpy(str2, str1); puts(str2); return 0; } char *strcpy (char destination[], const char source[]) { int size_of_array = sizeof source / sizeof source[0]; for (int i = 0; i < size_of_array; i++) { destination[i] = source[i]; } return destination; }
No sé qué significa la siguiente advertencia:
string_copy_withou_pointer.c:12:29: warning: sizeof on array function parameter will return size of 'const char *' instead of 'const char []' [-Wsizeof-array-argument] int size_of_array = sizeof source / sizeof source[0]; ^ string_copy_withou_pointer.c:11:46: note: declared here char *strcpy (char destination[], const char source[]) {
¿Alguna idea?
Esto se debe a que const char source[]
en la posición de argumento es solo azúcar sintáctica para const char *source
. Ver, por ejemplo, las notas C de Steven Summit .
En este caso particular, querrás llamar a strlen
. Cuando no esté tratando con cadenas, pase el tamaño de la matriz como un argumento separado.
Esta advertencia le indica que si llama a sizeof(char[])
no obtendrá el tamaño de la matriz sino el tamaño de un puntero char*
.
Esto significa que su variable size_of_array
estará equivocada porque no representará el tamaño de la matriz real.
Creo que estás buscando esto.
El tamaño de la matriz no sigue cuando se la pasa a la función. En realidad, se pasa como un indicador, por lo que se menciona el mensaje de advertencia
devolverá el tamaño de ‘const char *’