Malloc
sush
-
chwepsy -
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;
}
}
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
-
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 -
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? -
-
¡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)); -
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ónvoid ft_range(int **arr, int min, int max)
?
El software es como el sexo, es mejor cuando es gratis - Linus Torvald -
-
¿Tienes alguna idea de cómo hacerlo, o has probado algo?
--
El software es como el sexo, es mejor cuando es gratis - Linus Torvald -
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 -
-
¿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 -
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. -
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