Malloc

sush -  
 chwepsy -
Bonjour,


je commence a etudier la fonction malloc et pour moi ca ressemble a du chinoi...Par exemple pour creer une fonction qui retourne un tableau d int, qui contient tout les valeurs int et max, si min superieur a max un pointeur retournera 0 :
d apres ce que j ai compri il faut deja definir la valeur de malloc (#define LEN) mais vu qu il y a dans la fonction int max et min qui sont deja definit je ne vois pas trop quoi mettre apres le LEN ?

J ai essayer de commencer la fonction mais je seche completement.... Merci d'avance pour votre aide.

#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 réponses

juliencolin54 Messages postés 217 Date d'inscription   Statut Membre Dernière intervention   55
 
Bonjour,

Voici un code commenté qui devrait pouvoir répondre à tes attentes:
int	*ft_range(int min, int max)
{
int *arr; // Futur tableau d'int
int i;

if (min > max) // si min > max ; retourne 0
return (0);
arr = malloc(((max - min) + 2) * sizeof(int));
/*
** malloc <=> j'alloue (((max - min) + 2)) cases qui ont la taille d'un int
** Pour un tableau qui va de 1 à 3;
** ça fait (3 - 1) + 2 = 4 cases
** (de 0 à 3 + une dernière pour stocker null
*/
for (i = 0; i < ((max - min) + 1); i++) // remplissage du tableau avec les bonnes valeurs
arr[i] = min + i;
arr[i] = 0; // Dernière case du tableau a null pour detecter sa fin
return (arr);
}

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

arr = ft_range(5, 10); // assignation du tableau avec les valeurs min et max ; 5 & 10
if (arr)
while (*arr) // Affichage du tableau case par case
printf("%d\n", *(arr++));
return (0);
}
5
amn
 
C est pareil que pour le premier non ? Sauf que lorsque min > max ce sera un pointeur de range qui sera sur NULL, et ensuite pour retourner la taille de la range on mettre ca ? arr = malloc (range) * sizeof(int))

Et pour le premier if quand min>max return 0, vu que c est un pointeur nul qui sera retourne pourquoi ne met on pas de pointeur ?
1
chwepsy
 
42 spotted ;D

En definitive ca fait un chouette tuto, merci
1
amn
 
Bonjour je te remercie ! c est tres bien explique c est beaucoup plus claire comme ca . Juste un truc pour le min > max retourne 0, ca ne retourne pqs 0 mais nulle, donc je remplace 0 par NULL ? et c est cense renvoyer un pointeur nulle, donc il devrait avoir l etoile (*) du pointeur non ?


Apres j ai quasi le meme exercice, sauf qu lieu de renvoyer un tableau, il alloue et assigne un tableau d int, cela va etre la meme chose non ? Dans cette exercice la fonction aura un 'int' de plus (int **range), et celle ci pointera sur NULL si min > max, ensuite la taille de rang sera retourner, cela donnera ca ?

if (min > max)
range = NULL;
arr = malloc (range) * sizeof(int))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
juliencolin54 Messages postés 217 Date d'inscription   Statut Membre Dernière intervention   55
 
En fait NULL n'est qu'une macro comme une autre.
C'est le préprocesseur qui la remplacera automatiquement dans ton code par
((void *)0) ou ((char *)0) (ça dépend de ton architecture), donc par 0.
Par réflexe j'utilise 0 à la place de NULL, car ça fait gagner de la place.
A toi de prendre l'habitude que tu veux. Le tout c'est de le comprendre et de savoir expliquer pourquoi tu met 0 à la place de null, et en quoi c'est "équivalent".

Pour ton deuxième exercice, est-ce que le prototype de la fonction serait
void ft_range(int **arr, int min, int max)
?

Software is like sex, it's better when it's free - Linus Torvald
0
amn
 
Salut oui c est bien ca :)
0
juliencolin54 Messages postés 217 Date d'inscription   Statut Membre Dernière intervention   55
 
Est-ce que tu as une idée de comment le faire, ou as-tu testé quelque chose ?
0
juliencolin54 Messages postés 217 Date d'inscription   Statut Membre Dernière intervention   55
 
C est pareil que pour le premier non ? Sauf que lorsque min > max ce sera un pointeur de range qui sera sur NULL, et ensuite pour retourner la taille de la range on mettre ca ? arr = malloc (range) * sizeof(int)) 
--> Pas tout à fait, comme tu me l'as confirmé précédemment, la fonction de renverra rien (void).
Je te laisse réfléchir un peu et poster un code qui marche ou pas, pour que je te dises ce qu'il ne va pas.


Et pour le premier if quand min>max return 0, vu que c est un pointeur nul qui sera retourne pourquoi ne met on pas de pointeur ?
--> Je ne te l'ai pas expliqué deux post avant ? NULL est un pointeur... qui vaut 0.


0
amn
 
Desole j avais mal compris que NULL etait un pointeur, j ai fais ca, est ce bon ?


int *ft_range(int min, int max)
{
int *arr; // Futur tableau d'int
int i;

if (min > max)
**range = NULL;
arr = malloc (range) * sizeof (int));


for (i = 0; i < ((max - min) + 1); i++)
arr[i] = min + i;
arr[i] = 0;
}

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

arr = ft_range(5, 10);
if (arr)
while (*arr)
printf("%d\n", *(arr++));
return (0);
}
0
juliencolin54 Messages postés 217 Date d'inscription   Statut Membre Dernière intervention   55
 
C'est sensé être le code de ton premier ou deuxième exercice ?

0
amn
 
Deuxieme, si tu demandes ca c est que ce n est pas bon lol, mais de ce que j ai compris c est presque la meme chose, on va juste changer le pointeur range qui retourne donc null, et renvoyer sa valeur ?

Desole pour le temps de reponse, je fais la piscine de 42, on voit pleins de choses en meme temps je ne sais plus ou donner de la tete
0
juliencolin54 Messages postés 217 Date d'inscription   Statut Membre Dernière intervention   55
 
Pas de soucis,

En fait, je ne sais pas c'est quoi ton pointeur range, c'est ton double tableau d'entiers ?
0