Dans votre code add_mat
renvoie la pointeur vers la variable qui vit alors que la fonction s'exécute seulement. Vous pouvez accomplir votre objectif avec une matrice allouée dynamiquement.
En C, il est courant de transmettre une matrice allouée dynamiquement via pointeur vers des pointeurs vers les lignes de la matrice en tant que premier paramètre:
void foo(int** matrix, size_t m, size_t n);
Ici matrix
est un pointeur sur le tableau de pointeurs. Chaque pointeur de ce tableau pointe vers la ligne de la matrice. Ainsi, matrix[0]
pointe vers le tableau contenant la première ligne de la matrice.
Et il est courant d'utiliser le type size_t
pour toutes les tailles de matrices.
Si vous avez besoin de créer une matrice dynamiquement, faites attention à la mémoire. Chaque bloc alloué dynamiquement devrait être libéré. Sinon, vous aurez des fuites de mémoire, ce qui pourrait causer le crash du programme. Par conséquent, lorsque vous allouez des lignes de matrice, vous devez vérifier si l'allocation de la ligne actuelle a réussi. Si ce n'est pas le cas, vous devez libérer toutes les lignes précédemment allouées.
Il y a un code de travail pour votre question:
#include <stdio.h>
#include <stddef.h>
#include <malloc.h>
void free_mat(int** a, size_t m) {
if (!a) {
return;
}
for (size_t i = 0; i < m; ++i) {
free(a[i]);
}
free(a);
}
int** create_mat(size_t m, size_t n) {
int** rows = calloc(m, sizeof(int*));
if (!rows) {
return NULL;
}
for (size_t i = 0; i < m; i++) {
rows[i] = malloc(n * sizeof(int));
if (!rows[i]) {
free_mat(rows, m);
return NULL;
}
}
return rows;
}
void read_mat(int** a, size_t m, size_t n) {
for (size_t i = 0; i < m; i++) {
for (size_t j = 0; j < n; j++) {
printf("[%d][%d]: ", i, j);
scanf("%d", a[i] + j);
}
}
}
void print_mat(const int* const* a, size_t m, size_t n) {
for (size_t i = 0; i < m; ++i) {
for (size_t j = 0; j < n; ++j) {
printf("[%d][%d]: %d\n", i, j, a[i][j]);
}
}
}
int** add_mat(const int* const* a, const int* const* b, size_t m, size_t n) {
int** c = create_mat(m, n);
if (c) {
for (size_t i = 0; i < m; ++i) {
for (size_t j = 0; j < n; ++j) {
c[i][j] = a[i][j] + b[i][j];
}
}
}
return c;
}
int main() {
size_t m = 3;
size_t n = 3;
int** a = create_mat(m, n);
int** b = create_mat(m, n);
if (!a || !b) {
printf("error when allocating matrix\n");
}
else {
read_mat(a, m, n);
read_mat(b, m, n);
int** c = add_mat(a, b, m, n);
if (!c) {
printf("error when allocating matrix\n");
}
else {
print_mat(c, m, n);
free_mat(c, m);
}
}
free_mat(a, m);
free_mat(b, m);
return 0;
}
Mais vous serait plus souple, si add_mat
n'a pas créé une nouvelle matrice. Il est fréquent de passer un pointeur vers la matrice de résultat en tant que paramètre de fonction:
void add_mat(int** c, const int* const* a, const int* const* b, size_t m, size_t n);
Je propose 'int c [3] [3]; add_mat (c, a, b, m, n); ' – BLUEPIXY