[C] echange de blocs memoire entre tableaux

Walli -  
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 ?
A voir également:

3 réponses

mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
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
0
Moua
 
Bonjour,

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
0
Walli
 
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 !
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
comme tu as declaré les tableau de façon statique je pense que ce ne sont pas les cases memoire qui sont echange mais ce que que contient les cases memoires qui est echange

enfin c'est mon avis mais peu etre que j'ai tort ;)
0