Les tableaux et les pointeurs sont au cœur du langage C. Bien qu’ils offrent une grande flexibilité, ils sont également une source fréquente d’erreurs et de bugs difficiles à identifier. Ce guide explore les différences fondamentales, les pièges courants et des conseils pour déboguer efficacement.
int arr[] = {10, 20, 30}; int *p = arr; // p pointe sur le premier élément de arrprintf("%d\n", arr[1]); // Accès via le tableau printf("%d\n", *(p + 1)); // Accès via le pointeursizeof(arr) retourne la taille totale du tableau (ex. : 3 * sizeof(int)).sizeof(p) retourne la taille d’un pointeur (généralement 4 ou 8 octets).arr = p; // Erreur : Non modifiablemalloc.Accéder à un indice hors des limites d’un tableau entraîne un comportement indéfini :
int arr[3] = {1, 2, 3};
printf("%d\n", arr[5]); // Accès hors des limites
Conséquences :
Solution :
for (int i = 0; i < 3; i++) { printf("%d\n", arr[i]); }Un pointeur est dit dangling lorsqu’il pointe vers une zone mémoire libérée ou invalide.
int *p = (int *)malloc(sizeof(int));
free(p);
printf("%d\n", *p); // Pointeur dangling
Solution :
NULL après libération : free(p); p = NULL;Un pointeur non initialisé pointe vers une adresse aléatoire.
int *p;
printf("%d\n", *p); // Erreur : Pointeur non initialisé
Solution :
int *p = NULL;Ne pas libérer la mémoire allouée dynamiquement peut causer des fuites mémoire :
int *arr = (int *)malloc(5 * sizeof(int));
// Pas de free(arr) ici
Solution :
free(arr);Les pointeurs et les tableaux multidimensionnels peuvent être source de confusion :
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int *p = arr; // Erreur : Type incompatible
Solution :
int (*p)[3] = arr; // Pointeur vers un tableau de 3 élémentsgdb ./mon_programme
break main : Ajouter un point d’arrêt.run : Exécuter le programme.print *p : Afficher la valeur pointée par p.-fsanitize=address pour détecter les erreurs de mémoire.gcc -fsanitize=address -o mon_programme mon_programme.c
./mon_programme
valgrind ./mon_programme
Problème :
int arr[3] = {1, 2, 3};
for (int i = 0; i <= 3; i++) { // Erreur : Limite incorrecte
printf("%d\n", arr[i]);
}
Solution :
for (int i = 0; i < 3; i++) { // Correction
printf("%d\n", arr[i]);
}
Problème :
int *p = NULL;
printf("%d\n", *p); // Erreur : Déréférencement d’un pointeur NULL
Solution :
if (p != NULL) {
printf("%d\n", *p);
} else {
printf("Pointeur NULL\n");
}
Problème :
int *arr = (int *)malloc(5 * sizeof(int));
// Pas de libération
Solution :
free(arr);
arr = NULL;
NULL ou une adresse valide.free pour chaque malloc.Conclusion : La manipulation des tableaux et des pointeurs en C offre une grande flexibilité, mais nécessite une attention particulière pour éviter les erreurs courantes.
Les pointeurs et tableaux en C, bien qu’essentiels pour de nombreux programmes, peuvent facilement introduire des erreurs complexes et difficiles à déboguer. Voici un guide pratique pour éviter les erreurs courantes et améliorer la fiabilité de vos programmes.
int *p = NULL; // Pointeur initialisé à NULLint arr[5] = {0}; // Initialise tous les éléments à 0for (int i = 0; i < taille_tableau; i++) { printf("%d\n", tableau[i]); }sizeof pour calculer la taille d’un tableau statique. int arr[10]; int taille = sizeof(arr) / sizeof(arr[0]);if (p != NULL) { printf("%d\n", *p); }free. free(p); p = NULL;free pour Éviter les Fuites de Mémoireint *p = (int *)malloc(sizeof(int)); free(p); // Libère la mémoirefor (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix);\0\0 dans une chaîne peut provoquer des dépassements.\0. char str[6] = "Hello"; // OKstrncpy pour Limiter la Copiestrncpy à la place de strcpy. char dest[10]; strncpy(dest, "Hello", sizeof(dest) - 1); dest[sizeof(dest) - 1] = '\0'; // Terminez manuellementvoid printArray(int arr[], int taille) { for (int i = 0; i < taille; i++) { printf("%d\n", arr[i]); } }gdb ./mon_programmevalgrind ./mon_programme-fsanitize=address pour détecter les erreurs de pointeurs. gcc -fsanitize=address -o programme programme.c ./programme#define CHECK_PTR(p) if ((p) == NULL) { printf("Pointeur NULL\n"); return -1; }Quand on finance une voiture, tout le monde voit à peu près de quoi il…
On connaît tous ce moment : on tombe sur une offre de leasing “à partir…
Dans l’industrie, parler de maintenance sans préciser le niveau d’intervention revient souvent à créer de…
La Maintenance 1er Niveau - maintenance de niveau 1 - représente la première barrière contre…
Un outil simple pour mesurer la compréhension… et révéler les écarts invisibles Dans beaucoup d’organisations,…
Le levier discret qui transforme l’image, la cohésion et la performance d’une organisation Dans beaucoup…
This website uses cookies.