Envoyé par
Amnael
D’après ce que j'ai compris la seule différence entre calloc et malloc c'est que lors du malloc on doit utiliser un memset
Salut
On "doit" pas forcément utiliser memset. La seule règle universelle (valable aussi avec les variables simples) c'est qu'on doit toujours écrire au-moins une fois avant de lire. Donc si t'es certain de remplir ta zone avant de lire son contenu, memset() est inutile...
Envoyé par
Amnael
Je n'ai jamais vu d'utilisation de ce fameux memset d'où le fait que je galère à comprendre.
memset(zone, octet, taille) => remplira la zone de l'octet marqué sur la taille demandée
Envoyé par
Amnael
Par exemple; admettons que l'on est un tableau déclaré sous forme de pointeur; un tableau dynamique donc.
int tab*
Pour allouer de la mémoire j'ai réalisé un calloc comme ceci: t étant du type du tableau.
t=calloc(5 , sizeof(int));
Donc on aura l'équivalent d'un tableau t[5] sur lequel on peut travailler; affecter des valeurs ou autres.
Exact. Toutefois malloc/calloc ne se justifient vraiment que si tu ne connais pas la taille à l'avance quand le tu écris le programme.
Envoyé par
Amnael
Maintenant, admettons que ce tableau de taille 5 soit plein et que je veuille augmenter sa mémoire à nouveau c'est à dire passer de t[5] à t[8] par exemple.
Comment dois je procéder ? Je suppose que c'est là que le realloc entre en jeu ?
t=realloc(t, 8 * sizeof(int))
C'est la règle de base. Mais il est important de savoir que realloc peut échouer. Et dans ce cas, tu as perdu la zone initiale.
C'est pour ça qu'on passe généralement par un pointeur temporaire permettant de ne pas perdre t
1 2 3 4 5 6 7 8 9 10
| int *tmp;
tmp=realloc(t, 8 * sizeof(int))
if (tmp == NULL)
{
// Problème realloc - Ici il faut gérer le cas mais heureusement on a toujours t - Généralement on le libère et on quitte
free(t);
return // Code d'erreur
}
// Ici on sait que tmp a été correctement agrandi - On peut le remettre dans t
t=tmp; |
Envoyé par
Amnael
Malgré tout, il me semble que beaucoup de gens néglige l'aspect architectural d'un ordinateur.
Moi il me semble que beaucoup de gens négligent l'orthographe...
Envoyé par
Amnael
Je veux dire par là; c'est très bien de savoir que lorsqu'on crée une variable x à laquelle on donne une valeur; cette variable est stockée dans une adresse en mémoire. Mais je pense que ce qui fait la différence entre un programmeur du dimanche et un véritable programmeur concepteur qui comprend ce qu'il fait c'est justement le mécanisme machine; comment le système décide d'allouer telle case mémoire plutôt qu'une autre; comment cela se passe au niveau des composants physiques etc etc
Bon ben alors je suis un programmeur du dimanche...
Envoyé par
Amnael
Voici ce que l'on trouve dans le cours sur ces fonctions sur developpez.
J'ai placé un commentaire sur la ligne du calloc
1 2 3 4
|
int * tabentier;
/* Création d'un tableau de 3 entiers */
tabentier = calloc ( 3 , sizeof(int) ); // parfois je vois ce genre d'allocation se faire de cette façon et je ne comprends pas ce qu'elle veut dire tabentier =(tabentier) calloc ( 3 , sizeof(int) ); |
Si c'est vraiment écrit comme ça alors je ne sais pas ce que ça veut dire. Mais je pense que tu t'es trompé et voulait dire tabentier =(int*) calloc ( 3 , sizeof(int) );.
Ca date du C d'avant. A l'époque où le pointeur universel "void*" n'existait pas, malloc/realloc/calloc étaient du type "char*" (pointeur sur la plus petite entité manipulable au niveau adresse dans une philosophie "la mémoire ne contient en final que de l'octet donc du char").
Or pour ne pas avoir d'avertissement du compilateur, si on voulait stocker l'adresse d'un char dans un pointeur sur int, il était alors nécessaire de le caster. Au final c'est la même chose. Si malloc a renvoyé l'adresse 0x1010 ça reste une adresse. Simplement le compilo sait que 0x1010 correspond à un caractère (donc si on lui demande son contenu il ne récupèrera que cette case). Avec le cast, on lui dit "maintenant 0x1010 c'est l'adresse d'un entier donc si tu veux son contenu il te faudra récupérer deux (ou 4 ça dépend de l'architecture) cases". A mon avis, c'est ça qui fait la différence entre un programmeur du dimanche et un véritable programmeur concepteur qui comprend non pas ce qu'il fait mais ce qu'il se passe...
Partager