Obtenir une valeur de déchet lors de l’impression de la masortingce en C

J’ai appris le langage de programmation C il y a trois ans et maintenant, lorsque je le revisite après l’expérience de Java et de C #, je suis confronté à des problèmes avec les pointeurs. J’ai donc essayé d’écrire un programme simple d’addition de masortingce, mais je ne sais pas pourquoi je reçois des valeurs étranges lors de l’impression des masortingces.

Code:

#include  int* sumOfMat(int* m1,int* m2) { printf("Masortingx A: \n"); printMat(m1); printf("Masortingx B: \n"); printMat(m2); int mat3[3][3]; int row=0,col=0,k=0,sum=0; for(;row<3;row++) { col=0; for (;col<3 ;col++ ) { sum=(*m1+*m2); m1++; m2++; mat3[row][col]=sum; } } printf("Result: \n"); // printMat(mat3); //this statement is giving me a correct output. return mat3; } void printMat(const int m[3][3]) { int row,col; for (row=0;row<3 ;row++ ) { for (col=0;col<3 ;col++ ) { printf("%d\t",m[row][col]); } printf("\n"); } } int main(void) { int mat1[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int mat2[3][3]={{1,2,3},{4,5,6},{7,8,9}}; //add printf("Sum of the metrices : \n"); int* x=sumOfMat(&mat1,&mat2); printMat(x); // this call is providing me some garbage values at some locations. return 0; } 

Sortie:

 Success time: 0 memory: 2292 signal:0 Sum of the mesortingces : Masortingx A: 1 2 3 4 5 6 7 8 9 Masortingx B: 1 2 3 4 5 6 7 8 9 Result: 2 134514448 134514448 8 10 12 14 16 -1216458764 

Démo

Question: Pourquoi j’obtiens cette erreur et comment la corriger.

la ligne

 int mat3[3][3]; 

alloue votre tableau 2D sur la stack

Vous retournez un pointeur sur ce tableau.

 return mat3; 

Malheureusement, lorsque l’appel de fonction se termine, la stack est déchargée et la mémoire du tableau n’y est plus. Vous avez donc un pointeur sur garbage.

Une solution consiste à allouer le tableau dans votre fonction main et à le transmettre à sumOfMat tant que paramètre.

Ne retournez jamais un pointeur sur une variable automatique :

 int *f(void) { int i; .... return &i; } 

La variable i n’existant pas une fois que f retourné, le pointeur sur celle-ci sera invalide.
Dans votre cas, mat3 est une variable automatique et sumOfMat() renvoie un pointeur sur mat3 qui n’existe plus une fois que sumOfMat() renvoyé.
Une des solutions à votre problème est de définir mat3 tant que variable globale.

De plus, j’ai signalé un problème majeur avec votre code:

Le type de sumOfMat(int* m1,int* m2) de sumOfMat(int* m1,int* m2) est un pointeur sur l’entier ( int * ) pendant que vous renvoyez mat3 qui est de type int(*)[3] .
J’ai eu beaucoup d’avertissements lors de la compilation de votre code. J’ai corrigé la plupart d’entre eux.
Code modifié:

 #include  void printMat(int *m); int* sumOfMat(int* m1,int* m2); int mat3[3][3]; int* sumOfMat(int* m1,int* m2) { printf("Masortingx A: \n"); printMat(m1); printf("Masortingx B: \n"); printMat(m2); //int mat3[3][3]; int row=0,col=0,sum=0; for(;row<3;row++) { col=0; for (;col<3 ;col++ ) { sum=(*m1+*m2); m1++; m2++; mat3[row][col]=sum; } } printf("Result: \n"); // printMat(mat3); //this statement is giving me a correct output. return mat3[0]; } void printMat(int *m) { int row; for (row=1;row<=9 ;row++) { printf("%d\t",*m++); if(row%3 == 0) printf("\n"); } /* { for (col=0;col<3 ;col++ ) { printf("%d\t",m[row][col]); } printf("\n"); }*/ } int main(void) { int mat1[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int mat2[3][3]={{1,2,3},{4,5,6},{7,8,9}}; //add printf("Sum of the metrices : \n"); int* x=sumOfMat(&mat1[0][0],&mat2[0][0]); printMat(x); // this call is providing me some garbage values at some locations. return 0; } 

C’est parce que vous retournez mat3 qui est une variable locale définie comme

 int mat3[3][3]; 

Pour corriger cela, effectuez une allocation dynamic de mat3 aide de malloc OU transmettez-la en tant que out variable dans la fonction sumOfMat tant que troisième variable.