Exemples de pointeur arithmétique et de ses pièges en C et C++
L'arithmétique pointeur est une caractéristique courante en C et C++, permettant la manipulation directe des adresses de mémoire. Bien que l'utilisation puissante et inappropriée peut conduire à des bogues, des vulnérabilités de sécurité et un comportement non défini.
Exemple 1: Arrayages de traversée
L'arithmétique pointeur est souvent utilisé pour itérer efficacement les tableaux. Par exemple, pour résumer les éléments d'un tableau entier:
Utilisation correcte:
la somme int = 0;
int *ptr = tableau;
pour (int i = 0; i < taille; i++) {
somme += *(ptr + i);
}
Cette méthode accède correctement aux éléments de tableau en utilisant l'arithmétique pointeur.
Piège 1: Pointeur Arithmétique au-delà des bornes de la baie d'Array
Déplacer des pointeurs au-delà de la mémoire allouée peut causer un comportement non défini. Par exemple:
int *ptr = tableau;
pour (int i = 0; i <= taille; i++) {
printf("%dn", *(ptr + i));
}
L'accès à *(ptr + taille) dépasse les limites du tableau, ce qui conduit à des résultats imprévisibles.
Exemple 2: Manipulation de chaînes
L'arithmétique pointeur est fréquemment utilisé dans le traitement des chaînes. Par exemple, copier une chaîne :
Approche correcte:
char *src = "Bonjour";
de la part de l'autorité compétente,
char *p = src;
*q = dest;
pendant que (*p) {
*q++ = *p++;
}
*q = '';
Piège 2 : Erreurs hors-par-un dans la copie de chaînes
Ne pas attribuer de place au terminateur nul ou copier au-delà du tampon provoque des débordements de tampon. Par exemple :
les mesures de protection contre les accidents;
char *p = "monde";
pour (int i = 0; i <= 5; i++) {
det[i] = p[i];
}
Ceci copie six caractères dans un tampon à cinq caractères, causant un débordement.
Conclusion
L'arithmétique pointeur offre une flexibilité en C et C++, mais il faut une manipulation soigneuse pour éviter les erreurs.