В этом коде:
for (i=0; i<=siz;i++)
*(memblock+i) = 0;
memblock+i
добавляет целое число i
к указателю memblock
. Результат указывает i
элементов за пределы, где memblock
указывает. Поскольку memblock
является указателем на char
, результат указывает i
символов за пределы, где memblock
указывает.
Тогда *(memblock+i)
относится к символу по этому адресу. *(memblock+i)
эквивалентно memblock[i]
. *(memblock+i) = 0
устанавливает символ в ноль.
Таким образом, эффект этого кода - установить все символы, индексированные i
во время цикла, на ноль. Очищает блок памяти.
for (i=0; i<=siz;i++)
заставляет цикл повторяться с i
, принимая все значения от нуля до siz
включительно. Таким образом, siz
+ 1 символов будут установлены в ноль.
Мы видим, что это ошибка, поскольку get_argument
выделяет 512 байт для argument
, а затем вызывает clear_mem(argument, 512)
, что очищает 513 байт. Результирующее поведение не определяется кодом C.