Понятия не имею, откуда взялась эта цитата, но я могу попытаться дать какое-то объяснение.
Когда вы создаете массив (или malloc
), компилятор (или libc) выделяет место в стеке (или куче) для хранения этих данных. Вокруг этих данных могут храниться другие фрагменты данных, и запись в индексы массива, которые превышают то, что было выделено, может повредить эти данные.
char x[5];
int y;
short z;
Raw memory: (just an example, likely to vary)
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
b0000000 xx xx xx xx xx -- -- -- yy yy yy yy zz zz -- --
где xx, yy и zz соответствуют переменным x, y и z соответственно, и - добавляется дополнение. Когда вы ссылаетесь на x[4]
, это соответствует адресу x+sizeof(x[0])*4
(обратите внимание, что не синтаксис C: обычная арифметика, а не арифметика указателей), который равен b0000004
. Когда вы пишете в x[8]
, это соответствует b0000008
, где y
находится в этом примере. Записав x[8]
, вы фактически заставите значение y
измениться!
Что теоретически может произойти (но не определено, что произойдет):
char x[5];
int y;
short z;
y = 0x12345678;
x[8] = 0xad;
x[9] = 0xde;
printf("%#x\n", y);
/* 0x1234dead is printed ?!? */