Comment allouer de la mémoire pour un tableau (malloc)

Comment allouer de la mémoire pour un tableau (malloc) - C - Programmation

Marsh Posté le 24-03-2010 à 16:11:46    

Bonjour à tous,
 
Je voudrais, si possible que quelqu'un m'explique comment faire pour qu'un tableau ait un certain nombre de cases avec une certaine mémoire allouée avec l'instruction malloc et les pointeurs. Sachant que si je demande un certain nombre de cases; si ma fonction malloc en définit un nombre inférieur alors le tableau aura le nombre inférieur de cases données.
 
J'espère être clair dans mon explication. L'environnement est LabWindows.


Message édité par david13250 le 24-03-2010 à 16:20:36
Reply

Marsh Posté le 24-03-2010 à 16:11:46   

Reply

Marsh Posté le 24-03-2010 à 16:43:36    

Un tableau de type t, c'est n * la taille de t.
Du coup :
t *tableau = malloc(n * sizeof t);


Message édité par Elmoricq le 24-03-2010 à 16:43:53
Reply

Marsh Posté le 24-03-2010 à 19:36:40    

Merci pour ta réponse mais j'ai déja essayé cette solution et ça ne marche pas: sûrement un problème d'adresse mais je ne connais pas trop le fonctionnement de la fonction malloc hormis qu'elle alloue l'adresse du pointeur à une donnée si j'ai bien compris. Je pense qu'une explication s'impose si ça ne te dérange pas!? Peut être qu'avec realloc tu aurait une solution sinon je t'envois le code?

Reply

Marsh Posté le 24-03-2010 à 20:39:37    

La fonction void *malloc (size_t size) alloue size octets, et renvoie un pointeur sur la mémoire allouée.
 
Voir http://fr.wikipedia.org/wiki/Malloc et http://www.linux-kheops.com/doc/ma [...] loc.3.html
 
La fonction realloc() n'est à utiliser qu'après avoir fait un malloc(), si l'on veut changer la tailler initialement allouée.
 
Malloc() alloue un espace à une seule dimension. Mais peut-être que vous voudriez l'utiliser pour un truc qui n'a pas qu'une dimension, par exemple si votre tableau a à la fois des lignes et des colonnes, ou si vos cases n'ont pas toutes la même taille. Dans ce cas, vous pouvez faire plusieurs malloc(), ou bien faire un seul malloc() mais en transformant votre truc pour qu'il n'ait qu'une dimension, par exemple pour un tableau avec des lignes et colonnes, faire une multiplication et une addition pour déterminer l'endroit de chaque cellule.
 
N.B. Pour des tailles de tableau inférieures à 100 ko, il est souvent plus pratique de faire une allocation sur la pile ou sur le tas plutôt que de s'embêter avec des malloc() et des free().

Reply

Marsh Posté le 24-03-2010 à 20:40:35    

Documentation complète de malloc() : "man malloc" en ligne de commande sur un unix, ou dans google.
 
Le principe : ça alloue une zone mémoire, et ça retourne l'adresse du début de cette zone mémoire, et NULL en cas d'échec. À toi de savoir jusqu'où ça va pour ne pas dépasser ce qui a été allouer, et à libérer la mémoire avec free() quand tu n'en as plus besoin.
La fonction malloc() ne fait pas grand chose de plus. Même pas une initialisation de la mémoire allouée.  
 
La fonction realloc(), quant à elle et comme son nom l'indique, permet d'agrandir une zone mémoire allouée, quitte à la déplacer si besoin. La fonction realloc() retourne la nouvelle adresse en cas de succès, et NULL en cas d'échec (dans cette dernière situation, l'ancienne zone mémoire reste toujours valide).

Reply

Marsh Posté le 24-03-2010 à 20:57:43    

Ok, merci, je comprend mieux. Parce que dans les livres de c c'est plûtot succint. J'aurais maintenant une autre question car une fois que j'ai prévue une certaine place pour mon tableau comment est-il possible de remplir cet espace avec une partie du tableau créé au préalable sachant que cette partie à pour limite la mémoire allouée?? Merci d'avance!

Reply

Marsh Posté le 24-03-2010 à 21:07:05    

Pour reprendre l'exemple de mon premier post, tu accèdes à une "case" du tableau facilement avec "tableau[case]". Tant que case est < à n, tu es bon. À toi de conserver n et vérifier que les accès se font bien dans les limites que tu as définies à l'allocation de la mémoire.

 

En plus complet, la syntaxe "tableau[case]" est un raccourci pratique pour "tableau + (case * sizeof t)", c'est-à-dire "adresse de début + (nombre de cases  * taille d'une case)".

 

Après, les pointeurs offrent des possibilités plus étendues. Par exemple, tu peux faire des tableaux de pointeurs, c'est-à-dire un tableau d'adresses de zones mémoire. Ce qui revient à un tableau à 2 dimensions.
Tu peux ainsi ajouter autant de dimensions que tu le souhaites, en augmentant le nombre de couches de pointeurs. Mais, bon, en général mieux vaut se limiter à un faible nombre de couches, car le niveau de complexité augmente en proportion.


Message édité par Elmoricq le 24-03-2010 à 21:10:10
Reply

Marsh Posté le 24-03-2010 à 22:49:56    

Merci pour toute ces explications!!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed