Este tutorial ha sido probado por nuestros expertos para asegurar la veracidad de nuestro post.
Solución:
El estándar C no define el comportamiento de (&array)[1]
.
Considerar &array + 1
. Esto está definido por el estándar C, por dos razones:
- Al hacer aritmética de punteros, el resultado se define para los resultados del primer elemento (con índice 0) de un array a uno más allá del último elemento.
- Al hacer aritmética de punteros, un puntero a un solo objeto se comporta como un puntero a un array con un elemento. En este caso,
&array
es un puntero a un solo objeto (que es en sí mismo un arraypero la aritmética de punteros es para el puntero-al-arrayno un puntero a un elemento).
Entonces &array + 1
es una aritmética de punteros definida que apunta justo más allá del final de array
.
Sin embargo, por definición del operador subíndice, (&array)[1]
es *(&array + 1)
. Mientras que la &array + 1
se define, aplicando *
a que no lo es. C 2018 6.5.6 8 nos dice explícitamente, sobre el resultado de la aritmética de punteros, “Si el resultado apunta uno más allá del último elemento del array objeto, no debe ser utilizado como el operando de un unario *
operador que se evalúa.”
Debido a la forma en que están diseñados la mayoría de los compiladores, el código en la pregunta puede mover los datos como desee. Sin embargo, este no es un comportamiento en el que deba confiar. Puede obtener un buen indicador un poco más allá del último elemento de la array con char *End = array + sizeof array / sizeof *array;
. Entonces puedes usar End[-1]
para referirse al último elemento, End[-2]
para referirse al penúltimo elemento, y así sucesivamente.
Si te sientes estimulado, eres capaz de dejar una división acerca de qué te ha parecido este post.