[C] echange de blocs memoire entre tableaux
Walli
-
mype Messages postés 2435 Date d'inscription Statut Membre Dernière intervention -
mype Messages postés 2435 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai une petite question a poser. Est ce qu'en C, on peut echanger sans problème la mémoire de deux tableaux ? Par exemple :
quelque oart dans le main j'ai
...
int TAB_1[500]; // point (A]
// on remplit le tableau
// divers traitements
extraire(TAB_1); // ensuite on appele la fonction ou se fait l'échange
...
voici la fonction
int extraire(int *TABLEAU )
{
int TAB_F[150]; // point (B)
// on parcourt TABLEAU et on calcul des resulats
// qui sont mis dans TAB_F
// puis on échange
int *TMP;
TMP = TABLEAU;
TABLEAU = TAB_F;
TAB_F = TMP;
return 1;
}
Normalement, au retour de la fonction, TAB_1 pointe sur le tableau declaré au point (B). La question que je me pose, c'est : est que la suite du programme pourras gérer ces tableux normalement ?
TAB_F est detruit a la fin, mais est ce que cette mémoire declarée au point (A] est dessalouée sans problème ?
Et si plus loin, je fais des instructions qui lisent/ecrivent dans TAB_1 (et donc dans la mémoire allouée au point(B) ) le tableau seras correctement lu/écrit ? (si bien sur je respecte la limite du tableau) ?
Et quid si les deux sont déclarés par des malloc (ou l'un par un malloc et l'autre par une déclaration de tableau ?)
Je me dis que normalement ca devrait pouvoir fonctionner, puisqu'on continue à pointer sur le même type de variable, et que comme le C ne gere pas la taille des tableaux (mais apparement garantie la continuité du bloc mémoire), si on s'arange pour que le code reste dans les limites, ca peut marcher.
Par contre, je ne suis pas sur a 100 % qu'une mémoire donnée par malloc soit organisée comme celle donnée par un tableau, et qu'on puisse utiliser free pour une mémoire de tableau.
Q'uen dites vous ? Quelqu'un pourrait il me dire s'il y as une difference entre les deux types de blocs mémoire ?
J'ai une petite question a poser. Est ce qu'en C, on peut echanger sans problème la mémoire de deux tableaux ? Par exemple :
quelque oart dans le main j'ai
...
int TAB_1[500]; // point (A]
// on remplit le tableau
// divers traitements
extraire(TAB_1); // ensuite on appele la fonction ou se fait l'échange
...
voici la fonction
int extraire(int *TABLEAU )
{
int TAB_F[150]; // point (B)
// on parcourt TABLEAU et on calcul des resulats
// qui sont mis dans TAB_F
// puis on échange
int *TMP;
TMP = TABLEAU;
TABLEAU = TAB_F;
TAB_F = TMP;
return 1;
}
Normalement, au retour de la fonction, TAB_1 pointe sur le tableau declaré au point (B). La question que je me pose, c'est : est que la suite du programme pourras gérer ces tableux normalement ?
TAB_F est detruit a la fin, mais est ce que cette mémoire declarée au point (A] est dessalouée sans problème ?
Et si plus loin, je fais des instructions qui lisent/ecrivent dans TAB_1 (et donc dans la mémoire allouée au point(B) ) le tableau seras correctement lu/écrit ? (si bien sur je respecte la limite du tableau) ?
Et quid si les deux sont déclarés par des malloc (ou l'un par un malloc et l'autre par une déclaration de tableau ?)
Je me dis que normalement ca devrait pouvoir fonctionner, puisqu'on continue à pointer sur le même type de variable, et que comme le C ne gere pas la taille des tableaux (mais apparement garantie la continuité du bloc mémoire), si on s'arange pour que le code reste dans les limites, ca peut marcher.
Par contre, je ne suis pas sur a 100 % qu'une mémoire donnée par malloc soit organisée comme celle donnée par un tableau, et qu'on puisse utiliser free pour une mémoire de tableau.
Q'uen dites vous ? Quelqu'un pourrait il me dire s'il y as une difference entre les deux types de blocs mémoire ?
A voir également:
- [C] echange de blocs memoire entre tableaux
- Mémoire vive - Guide
- Echange photo - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Fichier d'échange windows - Guide
- Tableaux croisés dynamiques - Guide
3 réponses
moi je pense que sa marche avec ta fonction tu devrait retrouvé ds TAB_1 les elements de TAB_F plus d'autre elements puisque TAB_1 et TAB_F n'ont pas la meme taille
par contre free() ne marche que pour les malloc
par contre free() ne marche que pour les malloc
Bonjour,
non t'es tableau étant allouéstatiquement, tu ne peut pas faire une telle manoeuvre, par conte tu peux faire comme ca :
Avec ma fonction extraire, la désallocation se fait comme il faut, et l'échange de tableaux est possible
non t'es tableau étant allouéstatiquement, tu ne peut pas faire une telle manoeuvre, par conte tu peux faire comme ca :
int *tabA = malloc(150* sizeof(int)); //La tu remplis ton tableau extraire(&tabA); //Ci-dessous la fonction "extraire" void extraire(int **TABLEAU){ int* TAB_F=malloc(150*sizeof(int)); int *TMP; // on parcourt TABLEAU et on calcul des resulats // qui sont mis dans TAB_F TMP=TAB_F; TAB_F=*TABLEAU; *TABLEAU=TMP; //Désallouer TAB_F free(TAB_F); }
Avec ma fonction extraire, la désallocation se fait comme il faut, et l'échange de tableaux est possible
Merci a tous deux.
Je me doutais un epu (mais sans en etre sur) que ca ne pouvais pas etre aussi simple. Mais bon, c'est vrai que le premier est decalre statiquement, tandis que le second doit surement etre pris sur la pile ou le tas.
Par contre a coup de malloc et de free, ca doit marcher (logique d'ailleurs). D'ailleurs je me demandes si un tableau declaré par int TAB_1[500] n'est pas consideré comme constant, et qu'il y aurais une erreur à la c ompilation si j'essayais de lui assigner une autre adresse (faudras que je fasse des essais Lol )
Par contre mype, je ne vois pas pourquoi " plus d'autre elements " puisque les zones memoires devraient etre purement et simplement echangés et non pas l'une ecrite dans l'autre (tout ca dans l'hypothèese ou ca aurais marché, oeuf corse)
Bon, je vais aller "m'amuser" avec ce que vous m'avez dit. Bonne nuit et encore merci !
Je me doutais un epu (mais sans en etre sur) que ca ne pouvais pas etre aussi simple. Mais bon, c'est vrai que le premier est decalre statiquement, tandis que le second doit surement etre pris sur la pile ou le tas.
Par contre a coup de malloc et de free, ca doit marcher (logique d'ailleurs). D'ailleurs je me demandes si un tableau declaré par int TAB_1[500] n'est pas consideré comme constant, et qu'il y aurais une erreur à la c ompilation si j'essayais de lui assigner une autre adresse (faudras que je fasse des essais Lol )
Par contre mype, je ne vois pas pourquoi " plus d'autre elements " puisque les zones memoires devraient etre purement et simplement echangés et non pas l'une ecrite dans l'autre (tout ca dans l'hypothèese ou ca aurais marché, oeuf corse)
Bon, je vais aller "m'amuser" avec ce que vous m'avez dit. Bonne nuit et encore merci !