Pointeur et Tableaux

Fermé
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017 - 1 déc. 2017 à 17:17
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017 - 2 déc. 2017 à 16:23
Bonjour
Ci joint deux fonctions pour créer un tableau et le remplir a partir du clavier :

int* create_tab1(int n){
int i;

int* t=(int*)malloc(n*sizeof(int));

for(i=0;i<n;i++){
printf("entrez la valeur T[%d] : \n",i);
scanf("%d",t+i);
}
return t;
}


void create_tab2(int *t, int n){
int i;

t=(int*)malloc(n*sizeof(int));

for(i=0;i<n;i++){
printf("entrez la valeur T[%d] : \n",i);
scanf("%d",t+i);
}

}

et voila la fonction Main qui test la fonction Creat_Tab1 :

int main(){


int *T, n;


printf("entrez la valeur de N \n");
scanf("%d",&n);

T =(int*)malloc(n*sizeof(int));

T = create_tab1(n);


return 0;
}

et voila la fonction Main qui test la fonction Creat_Tab2 :

int main(){


int *T, n;


printf("entrez la valeur de N \n");
scanf("%d",&n);

create_tab2(T, n);

return 0;
}

je sais pas pourquoi la premier marche alors qu'en passant le T en paramètre, génère des valeurs incorrectes en affichant le tableau après sinon Windows me lance un message disant main.exe a cessé de fonctionner et ferme le programme

merci pour vos retours

2 réponses

Utilisateur anonyme
1 déc. 2017 à 21:20
Bonjour

Ta fonction create_tab2 remplit une table qui n'est pas celle que tu lui as passée en paramètre.
En effet, dans le programme principal, tu alloues une zone pour une table, et tu passes le pointeur à la fonction create_tab2.
Cette fonction reçoit une copie du pointeur. Je dis bien une copie du pointeur, pas le pointeur lui-même. Dans la fonction, tu alloues un nouveau tableau dont tu mets l'adresse dans cette copie du pointeur. Tu perds ainsi la trace du l'endroit où T pointait dans le programme principal. Ce qui se passe ensuite dans create_tab2 n'a plus aucun rapport avec la zone pointée par T.
0
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
2 déc. 2017 à 16:22
bien reçu , Merci beaucoup
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
2 déc. 2017 à 10:20
Bonjour,

Attention, l'exemple avec
create_tab1()
fait 2 allocations! Et aucune libération.

L'exemple avec
create_tab2()
. Une fonction ne peut modifier une variable de l'appelant que si elle est passée par adresse. Ici la variable est un pointeur, son adresse est donc un pointeur de pointeur.
void create_tab2( int** adr_t , int n ) { 
*adr_t = malloc( n * sizeof(int) );
int* t = *adr_t;
.....
0
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
2 déc. 2017 à 16:23
:) merci beaucoup
0