[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