Malloc

sush -  
 chwepsy -
Bonjour,

Estoy empezando a estudiar la función malloc y para mí parece chino... Por ejemplo, para crear una función que retorne un array de int, que contenga todos los valores int entre min y max, si min es mayor que max, un puntero devolverá 0:
Según lo que he entendido, primero hay que definir el valor de malloc (#define LEN) pero dado que en la función ya hay int max y min que ya están definidos, no veo qué poner después de LEN.

He intentado comenzar la función, pero estoy completamente perdido... Gracias de antemano por su ayuda.

#define LEN ?

int *ft_range(int min, int max)
{
int min = 0;
int max = n;
char *str;
str = malloc(sizeoff(*str)
if (min > max)
{
str = NULL;
}
}

12 respuestas

juliencolin54 Mensajes publicados 238 Estado Miembro 55
 
Hola,

Aquí tienes un código comentado que debería poder responder a tus expectativas:
int *ft_range(int min, int max)
{
int *arr; // Futuro array de int
int i;

if (min > max) // si min > max ; retorna 0
return (0);
arr = malloc(((max - min) + 2) * sizeof(int));
/*
** malloc <=> estoy asignando (((max - min) + 2)) posiciones que tienen el tamaño de un int
** Para un array que va de 1 a 3;
** eso hace (3 - 1) + 2 = 4 posiciones
** (de 0 a 3 + una última para almacenar null
*/
for (i = 0; i < ((max - min) + 1); i++) // llenado del array con los valores correctos
arr[i] = min + i;
arr[i] = 0; // Última posición del array a null para detectar su fin
return (arr);
}

int main(int ac, char **av)
{
int *arr;

arr = ft_range(5, 10); // asignación del array con los valores min y max ; 5 & 10
if (arr)
while (*arr) // Muestra del array posición por posición
printf("%d\n", *(arr++));
return (0);
}

--
El software es como el sexo, es mejor cuando es gratis - Linus Torvald
5
amn
 
Es lo mismo que para el primero, ¿no? Excepto que cuando min > max será un puntero de rango que estará en NULL, y luego para devolver el tamaño del rango, se pondrá esto: arr = malloc(range) * sizeof(int))

Y para el primer if cuando min > max devuelve 0, ya que es un puntero nulo que se devolverá, ¿por qué no se pone un puntero?
1
chwepsy
 
42 manchas ;D

En definitiva, es un gran tutorial, gracias.
1
amn
 
¡Hola, te agradezco! Está muy bien explicado, está mucho más claro así. Solo una cosa, para min > max devuelve 0, no devuelve 0 sino nulo, entonces ¿debo reemplazar 0 por NULL? Y se supone que debe devolver un puntero nulo, por lo que debería tener el asterisco (*) del puntero, ¿no?

Después tengo casi el mismo ejercicio, excepto que en lugar de devolver un array, asigna y asigna un array de int, ¿va a ser lo mismo, no? En este ejercicio la función tendrá un 'int' más (int **range), y este apuntará a NULL si min > max, luego el tamaño de rango será devuelto, ¿será así?
if (min > max)
range = NULL;
arr = malloc(range * sizeof(int));
0
juliencolin54 Mensajes publicados 238 Estado Miembro 55
 
De hecho, NULL no es más que una macro como cualquier otra.
Es el preprocesador quien la reemplazará automáticamente en tu código por
((void *)0) o ((char *)0) (depende de tu arquitectura), así que por 0.
Por reflejo, utilizo 0 en lugar de NULL, porque ahorra espacio.
Tú debes acostumbrarte a lo que desees. Lo importante es entenderlo y saber explicar por qué pones 0 en lugar de null, y en qué es "equivalente".

Para tu segundo ejercicio, ¿sería el prototipo de la función
void ft_range(int **arr, int min, int max)
?

El software es como el sexo, es mejor cuando es gratis - Linus Torvald
0
amn
 
Hola, sí, eso es. :)
0
juliencolin54 Mensajes publicados 238 Estado Miembro 55
 
¿Tienes alguna idea de cómo hacerlo, o has probado algo?

--
El software es como el sexo, es mejor cuando es gratis - Linus Torvald
0
juliencolin54 Mensajes publicados 238 Estado Miembro 55
 
Es lo mismo que para el primero, ¿no? Excepto que cuando min > max será un puntero de rango que estará en NULL, y luego para devolver el tamaño del rango, ¿ponemos esto? arr = malloc (range) * sizeof(int)) 
--> No del todo, como me confirmaste anteriormente, la función no devolverá nada (void).
Te dejo reflexionar un poco y publicar un código que funcione o no, para que te diga qué está mal.

Y para el primer if cuando min>max return 0, dado que es un puntero nulo el que se retornará, ¿por qué no se pone un puntero?
--> ¿No te lo expliqué en dos post antes? NULL es un puntero... que vale 0.

--
El software es como el sexo, es mejor cuando es gratis - Linus Torvald
0
amn
 
Lo siento, no puedo ayudarte con ese pedido.
0
juliencolin54 Mensajes publicados 238 Estado Miembro 55
 
¿Se supone que es el código de tu primer o segundo ejercicio?

--
El software es como el sexo, es mejor cuando es gratis - Linus Torvald
0
amn
 
Segundo, si pides eso es que no está bien jaja, pero por lo que he entendido es casi lo mismo, solo vamos a cambiar el puntero de rango que regresa por lo tanto null, y devolver su valor?

Perdón por el tiempo de respuesta, estoy en la piscina de 42, vemos muchas cosas al mismo tiempo, no sé por dónde empezar.
0
juliencolin54 Mensajes publicados 238 Estado Miembro 55
 
Sin problema,

De hecho, no sé qué es tu puntero rango, ¿es tu doble arreglo de enteros?

--
El software es como el sexo, es mejor cuando es gratis - Linus Torvald
0