Malloc

Fermé
Ohrrkan - 12 févr. 2003 à 12:42
 marvinrouge - 24 févr. 2003 à 09:09
bonjour , je cherche a comprend ce que fait exactement malloc, ou je pourrais bien trouver d el'aide dessus appart le man. enfait je ce que je croayais comprendre jusqua maintenant c ca:

si j'ai un

char *a

et je fait

a = malloc(8)

c pareil que ecrire des le deburt a[7]?

donc en resumer mon poiteur n'en ets plus un met est mainteant un tableaux? c ca?

4 réponses

eolim Messages postés 97 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 20 juillet 2005 2
23 févr. 2003 à 02:25
Salut,

Pour la pratique réfère toi à la réponse ci-dessus.

Comme il te l'a été expliqué, quand tu crées un tableau, lors de l'execution, l'espace mémoire affecté est défini. Il ne peut plus être changé.

Avec malloc( ), c'est différent. Tu peux te retrouver dans le cas où tu vas avoir besoin de mémoire, mais tu ne sais pas combien de place. Une première méthode est de définir un tableau de très grande taille. Avec les ordinateurs actuels, ça ne doit pas poser beaucoup de problème, mais au niveau optimisation c'est nul ! !
Avec malloc( ), tu peux déclarer dans ton programme que tu as besoin d'un espace mémoire pour un placer une valeur. Cette opération peut-être effectué en fonction de tes besoins.

Prenons un exemple. Tu peux vouloir lire le contenu d'un fichier. Au départ, tu ne connais pas la taille de ce dernier et le nombre d'élements contenus. Pour ces éléments, tu veux les chager en mémoire. Avec malloc( ), tu vas pouvoir donner à chacun des éléments du fichier un espace mémoire pour ensuite les manipuler.

Enfin, un espace réservé avec malloc( ) peut ensuite être rendu avec free( ).

Voilà, j'espère que tout ceci l'aidera...
A plus
eolim...
1
1) il vaut mieux écrire

a = (int *)malloc(8*sizeof(int)) ; // on caste avec le type de a DEVANT le malloc et on alloue N cases * sizeof(int)


2) ce n'est pas équivalent pour 2 raisons

a) 7<8
b) LA PLUS IMPORTANTE:
int a[8]; // a a une taille FIXE !!!
int * b = (int *)malloc(8*sizeof(int));

tu PEUX REDIMMENSIONNER b quand tu veux par exemple
if (b!=null)
free(b);
b = (int *)malloc(53*sizeof(int));
0
pour repondre exactement a la question:
char *a
a = malloc(8)
on peut diçre que:
&a[0]=a
donc en resumer mon poiteur n'en ets plus un met est mainteant un tableaux? c ca?
pas exactement c le tableau qui se comprtent comme ton pointeur et non l'inverse!!
0
faut faire
char *a
a = (char*)malloc(8)

et non pas
char *a
a = malloc(8)

pour éviter des warnings à la compilation

char* a est CE QUE TU EN FAIS
c'est à dire
- soit un pointeur vers un char
- soit un tableau de char

c'est la grosse ambiguité de C avec les pointeurs/tableaux: c'est la manière dont tu l'utilises qui décides ce que c'est

exemple:

char* a = (char*)malloc(1*sizeof(char)) ==> a est un pointeru vers 1 caractère

int N = ... ; // N>1 !!!
char* a = (char*)malloc(N*sizeof(char)) ==> a est un tableau de caractères. a est AUUSI le pointeru vers le PREMIER caractère du tableau

pigé ???

marvinrouge
0