1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
void free_tab(int **tab, size_t nblignes)
{
size_t i;
if (tab == NULL) return;
for (i=0; i < nblignes && tab[i] != NULL; i++)
free(tab[i]);
free(tab);
}
int main()
{
size_t nblignes=5;
size_t nbcolonnes=5;
size_t i, j;
int ** tableau2d;
tableau2d=malloc(nblignes*sizeof(int*));
if (tableau2d == NULL)
{
fprintf(stderr, "erreur malloc(%lu) - %s\n", nblignes * sizeof(int*), strerror(errno));
exit(1);
}
// Remplissage
for( i = 0; i < nblignes; i++)
{
tableau2d[i] = malloc(nbcolonnes*sizeof(int));
if (tableau2d[i] == NULL)
{
// On libère ce qui a déjà été alloué (donc les "i" lignes correctement allouées)
free_tab(tableau2d, i);
fprintf(stderr, "erreur malloc(%lu) - %s\n", nbcolonnes * sizeof(int), strerror(errno));
exit(2);
}
for (j=0; j < nbcolonnes; j++)
{
tableau2d[i][j]=i * j;
}
}
// Affichage
for( i = 0; i < nblignes; i++)
{
// Affichage de l'adresse de la ligne (pour mieux comprendre comment marchent les pointeurs)
printf("ligne[%lu]=0x%04x: ", i, tableau2d[i]);
// Affichage de la valeur de la case et de son adresse (là aussi pour bien piger les pointeurs)
for (j=0; j < nbcolonnes; j++)
{
printf("%lu (0x%04x), ", tableau2d[i][j], &tableau2d[i][j]);
}
// La ligne est finie => fin de ligne
fputc('\n', stdout);
}
// Nettoyage
free_tab(tableau2d, nblignes);
} |
Partager