Они эквивалентны только если sizeof(*self->broadcaster.events) == 1
.
Для ясности я заменил self->broadcaster
на b
и events
на e
и добавил пробел в ваш код.
memmove(b.e + b.e_head + b.e_size, b.e + b.e_head, b.e_size - b.e_head);
скопирует только b.e_size - b.e_head
байт, и цикл:
for (i = 0 ; i < b.e_size - b.e_head ; ++i)
b.e[b.e_size + b.e_head + i] = b.e[b.e_head + i];
скопирует (b.e_size - b.e_head) * sizeof *b.e
байтов, потому что каждое b.e[...] = b.e[...]
назначение перемещается на sizeof *b.e
байтов, а каждое ++i
продвигает адрес b.e[... + i]
на sizeof *b.e
байтов.
Вам будет лучше, если вы определите макрос:
#define MOVE(dst, src, count) memmove((dst), (src), (count) * sizeof *(src))
и используйте его вместо memmove
.
Но вы, конечно, можете просто изменить последний аргумент memmove
на
(self->broadcaster.events_size-self->broadcaster.events_head)*sizeof*self->broadcaster.events