Creo que hay un buen argumento para sugerir que una implementación conforme a C no puede permitir que una matriz termine en (por ejemplo) 0xFFFFFFFF.
Let p
ser un puntero a un elemento-de-la-end-of-the-matriz: si buffer
está declarada como char buffer[BUFFSIZE]
, entonces p = buffer+BUFFSIZE
, o p = &buffer[BUFFSIZE]
. (Esto último significa lo mismo, y su validez se explicitó en el documento estándar C99.)
Esperamos entonces que las reglas ordinarias de comparación de punteros funcionen, ya que la inicialización de p
fue un bit ordinario de aritmética de puntero. (No puede comparar punteros arbitrarios en C estándar, pero puede compararlos si ambos están basados en una única matriz, búfer de memoria o estructura). Pero si buffer
terminara en 0xFFFFFFFF, entonces p
sería 0x00000000, y tendríamos el situación improbable que p < buffer
!
Esto rompería una gran cantidad de código existente que asume que, en la aritmética válida del puntero hecha en relación con una base de matriz, se cumple la propiedad intuitiva de ordenamiento de direcciones.
¿Qué te hace pensar que '0xFFFFFFFF' es el elemento más grande posible? ¿Qué pasa con las arquitecturas de 64 bits? –
Es * no * legal acceder a punteros uno-pasado-al-fin. Solo es legal crearlos, no desreferenciarlos. – Xeo
@Chris Eso es lo que quería saber, si estoy haciendo suposiciones no válidas que posiblemente pueda aclarar. Y digamos solo 32 bits. – Marlon