Malloc

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

  1. 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
    1. 42 manchas ;D

      En definitiva, es un gran tutorial, gracias.
      1
      1. 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
        1. 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
          1. ¿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
            1. 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
              1. 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
                1. ¿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
                  1. 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
                    1. ¡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