Malloc

Fermé
sush - Modifié par sush le 18/09/2013 à 13:03
 chwepsy - 26 sept. 2013 à 05:43
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 dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
18 sept. 2013 à 14:20
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
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
42 spotted ;D

En definitive ca fait un chouette tuto, merci
1
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 dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
Modifié par juliencolin54 le 18/09/2013 à 15:00
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
Salut oui c est bien ca :)
0
juliencolin54 Messages postés 217 Date d'inscription dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
18 sept. 2013 à 15:14
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 dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
18 sept. 2013 à 15:29
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
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 dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
18 sept. 2013 à 16:25
C'est sensé être le code de ton premier ou deuxième exercice ?

0
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 dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
20 sept. 2013 à 08:43
Pas de soucis,

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