[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