[cdev] Задача_6. гр 135

Grigoriy A. Sitkarev sitkarev на komitex.ru
Вт Сен 21 19:31:48 MSK 2010


Наверное стоит дать пояснение почему это ошибка.

Когда мы работаем с адресной арифметикой, т.е. прибавляем, вычитаем и 
т.д. с указателями, то все операции с ними идут по кратности размера 
типа, на который ссылается указатель. Для примера, если это указатель на 
int то при прибавлении или вычитании N к адресу прибавляется или 
вычитается N*sizeof(int) а не N.

Функция memset(3) она в первом аргументе ждёт адрес, в последнем 
количество в байтах. Размер мы вычислили правильно, а вот со смещением 
получается ошибка, потому что queue->heap он указывает на struct 
prioq_head, а наше смещение там посчитано в байтах а не в элементах 
struct prioq_head. Значит мы убежим слишком далеко указателем и затрём 
память там где не надо.

Поэтому или изменить смещение на количество элементов, они у нас в 
queue->size, или же привести тип queue->heap к (void *), тогда все 
арифметические операции с таким указателем будут по кратности байта.

--
Г.А.

jam пишет:
> вроде еще одна ошибка кочует из исходника в исходник
> 
> memset(queue->heap + OLD_SIZE(queue), 0, NEW_SIZE(queue) -
> OLD_SIZE(queue));
> 
> memset(queue->heap + queue->size, 0, NEW_SIZE(queue) - OLD_SIZE(queue));




Подробная информация о списке рассылки cdev