Dudas con malloc...

Iniciado por Metal-byte, 30 Diciembre 2011, 20:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Metal-byte

Buenas.
Últimamente he hecho algunos programa con utilizando punteros, y me ha surgido una duda con la implementación de la función malloc.

El tema, es que he visto que en algunos programas implementan malloc de estas formas:


int *p;

//Implementación 1
p = (int *)malloc(sizeof (int));

//Implementación 2
p = malloc(sizeof (int));


Por ahora he probado ambas formas, y me funcionan de igual manera... me han dicho que cuando incluyo el (int *) es una especie de casteo para la asignación de memoria, pero como he dicho anteriormente, me ha funcionado con o sin esto...

Para que sirve realmente?
Que consecuencias podría traer el usar una u otra?

Eso, saludos.

rir3760

Esas conversiones explicitas dependen del lenguaje utilizado (C o C++).

En el caso de C++ son obligatorias ya que lo requiere el lenguaje: un puntero de tipo "void *" como el retornado por malloc deben convertirse explícitamente al tipo apropiado. En este lenguaje se recomienda el uso de new + delete (ya que con ellos se llama a los constructores/destructores de los objetos, algo que no pasa con malloc).

En el caso de C no son necesarias y no se recomiendan ya que un "void *" puede almacenarse en una variable de tipo "T *" (donde "T" puede ser cualquier tipo).

En C el idioma o convención informal para una llamada a malloc es:
int *p;

/* ... */

p = malloc(N * sizeof *p);

Donde "N" es el numero de elementos y se utiliza "sizeof *p" para no tener que indicar el tipo (asi se puede cambiar el tipo de "p" a, por ejemplo, "long *" y la llamada a malloc no tiene que cambiarse).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Metal-byte

Ahhh ok. Estoy trabajando en C, debe ser por eso que me acepta ambas implementaciones.

Muchas gracias ^^