En C, il est parfaitement bien de faire un pointeur qui pointe vers un au-delà du dernier élément d'un tableau et de l'utiliser dans l'arithmétique de pointeur, aussi longtemps que vous n'avez pas déréférencement d'elle:
int a[5], *p = a+5, diff = p-a; // Well-defined
Cependant, ces UBs:
p = a+6;
int b = *(a+5), diff = p-a; // Dereferencing and pointer arithmetic
Maintenant, j'ai une question: est-ce que la mémoire allouée dynamiquement? Supposons que je suis le seul à l'aide d'un pointeur pointant vers un passé-le-dernier dans l'arithmétique de pointeur, sans déférence, et malloc()
réussit.
int *a = malloc(5 * sizeof(*a));
assert(a != NULL, "Memory allocation failed");
// Question:
int *p = a+5;
int diff = p-a; // Use in pointer arithmetic?