Bonjour,
Vous pouvez postez ici vos avis, remarques, suggestions sur l'article suivant :
http://rperrot.developpez.com/articles/c/allocationC/
NB: Merci de lire ce message avant de poster.
Bonjour,
Vous pouvez postez ici vos avis, remarques, suggestions sur l'article suivant :
http://rperrot.developpez.com/articles/c/allocationC/
NB: Merci de lire ce message avant de poster.
Bonsoir,
Juste pour vous signaler une petite erreur dans un code de votre tutoriel :
La condition de la boucle for est mauvaise : elle s’arrêtera au troisième élément du tableau, et n'affichera donc pas tabentier[3] = 4, comme attendu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int * tabentier; /* Création d'un tableau de 3 entiers */ tabentier = calloc ( 3 , sizeof(int) ); tabentier[0] = 1; tabentier[1] = 2; tabentier[2] = 3; /* Ajout d'un element au tableau */ tabentier = realloc (tabentier, 4 * sizeof(int) ); tabentier[3] = 4; for ( i = 0 ; i < 3 ; i++ ) { printf(" tabentier[%d] = %d \n", i , tabentier[i] ); }
Merci.
Bonne continuation,
neow_
Je trouve le tutoriel excellent. Cependant, il y a un problème avec les macros MALLOC, CALLOC et REALLOC. Prenons ce code tiré du tutoriel par exemple :
Si CALLOC echoue disons alors qu'on en est à i = 2, matrice[2] va certes être libéré mais le programme se termine tout de suite : matrice[1], matrice[0] et matrice n'ont pas été libérés ! Il faut donc soit les retirer du tutoriel, soit les corriger.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 int ** matrice , i; /* un tableau à deux dimension */ /*allocation d'un tableau de trois tableaux d'entiers */ MALLOC(matrice,int*,3); for ( i = 0 ; i < 3 ; i ++ ) { /* allocation d'un tableau de tableau */ CALLOC(matrice[i],int,3); } /*remplissage d'une matrice diagonale*/ for ( i = 0 ; i < 3 ; i++ ) { matrice[i][i] = 1; } for(i = 0 ; i<3 ; i++) { FREE(matrice[i]); } FREE(matrice);
minfo21 > Merci, mais j'avais déjà résolu le problème, c'était juste pour signaler l'erreur.
Je trouve ce didacticiel de très bonne qualité. Je reste toutefois sur ma fin par rapport aux macros proposées dans la section 4.2 qui cachent des exit() sauvages qui ne me plaisent pas. L'utilisation de tels points de sortie est certes souvent utilisé dans un contexte d'enseignement. Il y a toutefois certainement de meilleures façons de traiter ce type d'erreurs d'allocation dynamiques de mémoire dans la vraie vie. C'est à priori à mon avis une mauvaise pratique et je me demande s'il est opportun en tout cas de cacher ces points de sortie dans une macro. Typiquement, dans une fonction de création de matrice, ma stratégie sera, en cas d'erreur d'allocation, de faire le ménage (i.e. libérer tout ce qui a été allouer), puis de faire remonter l'erreur d'allocation, éventuellement jusqu'à main() qui sera la seule fonction autorisée à quitter l'application.
Avec mes meilleures salutations
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Je comprends beaucoup mieux. J'en conclue donc que PRomu@ld avait fait le bon choix et je rectifierais en conséquence cette erreur que je fais souvent dans mes codes avec realloc.Par medinoc
Si realloc() ne retourne ni NULL ni tabentier, ça veut dire:
- Le pointeur retourné pointe sur le buffer voulu,
- tabentier n'est plus un pointeur valide (realloc() a fait un free() dessus).
Bonne soirée à vous !
Partager