[C con Clase] Cannot convert from 'char *' to 'char []
Mariano Demarchi
marchi.hh en gmail.com
Mie Ene 6 17:13:41 CET 2010
Para agregar a lo que ya explicó David, la razón por la que no compila
1: char str[20];
2: str = ctime(&now);
es que el tipo de str es equivalente a
char * const str;
es decir, un puntero constante a un char.
En consecuencia, si el puntero es constante, no puede ser modificado.
Así con la alternativa que pusiste, terminas dejando 20 bytes cada vez que
llamas a ctime. Y además al hacer el free, estas intentando liberar una zona
de memoria que no se reservó con malloc[1], con lo cual no sabés que
problemas inesperados te pueden ocurrir.
La forma de hacerlo sería:
1: char *str;
2: str = ctime(&now);
Saludos
[1] http://www.bsdlover.cn/study/UnixTree/V5/usr/source/s3/ctime.c.html
Hola Lista,
>
> Bueno, esto es una duda que siempre he tenido, el hecho de utilizar
> una función que devuelve un char* y en su lugar lo que estoy
> poniendo es una variable de arreglo. Pongo un ejemplo para que esto
> se vea mejor. Vamos a suponer que tenemos lo siguiente:
>
> 1: char str[20];
> 2: str = ctime(&now);
>
> Aquí en la línea 2 es donde se presenta el error que tiene por
> título el correo, y lo cual me queda bien claro y es que no puede
> asignarle el puntero al arreglo de 20 caracters.
>
> Una alternativa que he utilizado en ocasiones es la siguiente:
>
> 1: char *str = (char *)malloc(sizeof(char) * 20);
> 2: str = ctime(&now);
> 3: ...
> 4: free(str);
>
> y la cual veo conveniente; pero ustedes se imaginan el hecho de que
> esto esté dentro de un ciclo, que esté constantemente en cada
> iteración reservando y liberando la memoria, me imagino también que
> pensarían y bueno, si siempre es esa cantidad porque no se reserva y
> libera fuera del ciclo, lo cual está bien. Pero al respecto sigo
> reflexionando, tengo entendido, y que me corrijan si me equivoco,
> porque no conozco mucho al respecto, en el primer ejemplo cuando se
> compila ya se ha reservado ese espacio de memoria el cual siempre ya
> estará utilizable, lo cual no sucede así en el segundo ejemplo y que
> se irá reservando y utilizando durante la ejecución, tema que demora
> la ejecución de la aplicación.
>
> Espero, tener comentarios al respecto y bueno, tal vez otra
> alternativa de solución.
>
> --
> Salu2,
> Gilbert
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100106/d464ffb1/attachment.html>
Más información sobre la lista de distribución Cconclase