C memmove等效于for loop-segfault

C memmove等效于for loop-segfault,c,segmentation-fault,buffer,memmove,C,Segmentation Fault,Buffer,Memmove,我正在实现动态调整大小的环形缓冲区。当尾部位于头部之后时,在调整大小后,必须将缓冲区末端的数据移动到缓冲区的新末端。为此,我编写了以下代码: memmove(self->broadcaster.events+self->broadcaster.events_head+self->broadcaster.events_size, self->broadcaster.events+self->broadcaster.events_head,

我正在实现动态调整大小的环形缓冲区。当尾部位于头部之后时,在调整大小后,必须将缓冲区末端的数据移动到缓冲区的新末端。为此,我编写了以下代码:

memmove(self->broadcaster.events+self->broadcaster.events_head+self->broadcaster.events_size,
              self->broadcaster.events+self->broadcaster.events_head,
              self->broadcaster.events_size-self->broadcaster.events_head);
其中
self->broadcaster.events\u size
为旧尺寸(新尺寸/2)。不幸的是,它会导致分割错误。我认为它与这个代码是等价的:

for (i = 0 ; i < self->broadcaster.events_size - self->broadcaster.events_head ; ++i)
        self->broadcaster.events[self->broadcaster.events_size+self->broadcaster.events_head+i]=
            self->broadcaster.events[self->broadcaster.events_head+i];
for(i=0;ibroadcaster.events\u size-self->broadcaster.events\u head;++i)
self->broadcaster.events[self->broadcaster.events\u size+self->broadcaster.events\u head+i]=
self->broadcaster.events[self->broadcaster.events_head+i];

但是这种天真的for循环实现可以正常工作,所以我似乎不知道如何正确使用
memmove
。这两段代码有何不同?

只有当
sizeof(*self->broadcaster.events)==1时,它们才是等效的

为了清楚起见,我用
b
替换了
self->broadcaster
,用
e
替换了
events
,并在代码中添加了一些空格

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];
并使用它而不是
memmove

但是您当然可以将
memmove
的最后一个参数更改为

(self->broadcaster.events_size-self->broadcaster.events_head)*sizeof*self->broadcaster.events

为什么数据必须在环形缓冲区中移动?这是一个XY问题吗?@WeatherVane当环形缓冲区经常太短时,我会动态地增加它的大小。如果缓冲区不是continuos(它是循环的),那么在重新分配缓冲区后,它的后部必须移动到新的端部,以便使这种环形缓冲区在环形缓冲区的意义上成为“continuos”。描述它:
OO--OO
--(realloc)-->
OO--
--(memmove)-->
OO---OO
broadcaster.events
的类型是什么?
(self->broadcaster.events_size-self->broadcaster.events_head)*sizeof*self->broadcaster.events