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