[devel] memcpy глючит (или я не умею его готовить)

Leonid Krivoshein klark.devel на gmail.com
Сб Фев 23 16:08:09 MSK 2019


23.02.2019 15:55, Alexey V. Vissarionov пишет:
> On 2019-02-23 15:28:44 +0300, Leonid Krivoshein wrote:
>
>   >>> void-указателями такого не проделаешь, в отличие от gcc, который
>   >>> тоже  >>> ни один стандарт могёт.
>   >> Я не понял этой фразы и сравнения указателей с gcc. При чем тут
>   >> указатель на void? Размер объекта в этом случае не известен,
>   >> разумеется арифметика не работает.
>
> Арихметика работает независимо от. Например, конструкцию вида
>
> void *x; int y = x[1];
>
> компилятор пошлет по азимуту, и правильно сделает. Но при этом
>
> void *x; int y = x+123;
>
> не вызовет у компилятора никаких эмоций

А по-моему здесь будет ворнинг. Но можно проверить.


> и превратится (на писюшатине)
> в самый обычный lea. Почему? Потому что это обычное сложение, а как
> потом будет использоваться результат - уже забота не компилятора, а
> программиста.
>
> Если что, я такие конструкции регулярно использую, когда пишу для
> контроллеров.

В любом случае я бы такие рисковые конструкции не использовал.


>   > Вы прибавляете к адресу целое число, которое является чем?
>   > Разницей в адресах или индексах?
>
> sizeof(void) - это сколько? :-)

Вчера было 1 (для gcc). Но тогда это ответ неверный. Потому что, 
согласно стандарту, разница должна быть в индексах, а не в байтах. И 
согласно ему же результат такого сложения с void* не определён. А в gcc 
это будет эквивалентно char* + int.


-- 
Best regards,
Leonid Krivoshein.



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