El manejo de arrays en C se hace sin comprobación alguna de que el índice utilizado para acceder a un elemento esté en los límites correctos. De este comportamiento se deriva que los punteros y los arrays son, a efectos del compilador, lo mismo, una dirección de memoria sobre la que se puede utilizar entre corchetes un índice para acceder a un elemento. Este comportamiento se mantiene para el caso de la memoria dinámica, es decir, si se reserva espacio en memoria dinámica para un puntero o un array y en su acceso se rebasa el tamaño de su porción de memoria, la ejecución continua sin ningún tipo de comprobación. El siguiente fragmento de código ilustra esta situación.
struct point_info { int x; int y; }; struct point_info *points; points = (struct point_info *)malloc(100 * sizeof(struct point_info)); points[356].x = 10; points[356].y = 20;
Como el índice que se utiliza para el acceso de las dos últimas líneas está fuera de los límites, se está accediendo a una porción del heap que contiene otros datos que pueden estar reservados o no. El efecto es imprevisible, pero el programa no realiza ninguna comprobación.