by SPL3EN » Fri Jul 29, 2011 11:53 am
Hum...
Bon tout d'abord, le code que tu as donné est le correct.
Mais ce que je voulais dire depuis le début en fait, c'est qu'il existe déjà une fonction toute faite et bien plus optimisée pour ce genre d'opération : memcpy.
Ca a fait tout de même un bon exercice :)
Bref, sinon le premier code (censé me démontrer je ne ciomprends pas quoi) ne montre rien :
main : [code:1:397e67387a]tab = malloc(sizeof(int)*10);
[/code:1:397e67387a]
Ok, tu alloues 10*int de mémoire dont le pointeur est tab
Puis tu affiches [b:397e67387a]l'adresse du pointeur[/b:397e67387a][code:1:397e67387a]
printf("Adresse du tableau : %p\n", &tab);
>> Adresse du tableau : 0022FF18 [/code:1:397e67387a]
Très bien, certes.
main : [code:1:397e67387a]tab = mafonction();[/code:1:397e67387a]
Tu demandes à ce que l'adresse que pointait tab soit modifiée par le retour de la fonction mafonction. Ok.
mafonction :[code:1:397e67387a] tab_tmp = malloc(sizeof(int) * 10);
[...]
return tab_tmp;[/code:1:397e67387a]
Tu alloues 10 nouveaux int, tu attribues leur pointeur à tab_tmp que tu retournes.
tab dans le main (étant actuellement l'adresse de 10 int en mémoire) va donc prendre la valeur de l'adresse de 10 autres int quelque part d'autre dans la mémoire.
Par contre, là où il y a malaise, c'est qu'en pensant faire un return tab_tmp, tu penses "désallouer" le contenu d'un "tableau temporaire" contenu dans tab_tmp.
Ca marche pour les tableaux déclarés de façon locales, comme char tab_tmp[10], mais ça ne marche pas comme ça pour les pointeurs.
De ce fait, il y a une fuite mémoire dans ton programme :
L'adresse de la mémoire allouée par le premier tab = malloc(sizeof(int) * 10); dans le main est perdu par l'écrasement de cette adresse par celle retournée par mafonction.
Il est donc inutile d'allouer un quelconque espace mémoire pour tab puisque mafonction s'en charge.
Et là où intervient le second malaise, c'est quand tu check l'adresse du pointeur après l'appel de mafonction.
[code:1:397e67387a]printf("Adresse après modification : %p\n", &tab); [/code:1:397e67387a]
Bien évidemment elle n'aura pas changée puisque tu ne l'as pas modifiée. (tu as modifié tab lui même mais jamais son adresse)
Néanmoins, ce n'est pas de &tab dont tu devrais t'intéresser, mais de tab lui même.
Bref, je sens une large confusion avec tout ce qui est variable déclarée globalement/statistiquement, pointeurs et adresses, des notions bien moins importantes en orienté objet donc je comprends.
En tout cas problème résolu :)