C 这个简单的队列实现有什么问题吗?
假设数组总是连续的, 我想知道现在我正在做memcpy,QPop函数是否有什么问题C 这个简单的队列实现有什么问题吗?,c,queue,C,Queue,假设数组总是连续的, 我想知道现在我正在做memcpy,QPop函数是否有什么问题 -- C snip --------- int Q[5]; int QPush(); static int pushIdx; int QPush (int *q, int val) { int ret=0; if ( isQFull(q) ) return -1; q[pushIdx++] = va
-- C snip ---------
int Q[5];
int QPush();
static int pushIdx;
int QPush (int *q, int val)
{
int ret=0;
if ( isQFull(q) )
return -1;
q[pushIdx++] = val;
return ret;
}
int QPop ( int *q)
{
int i, ret=0;
unsigned long size = pushIdx -1 ;
if ( isQEmpty(q) )
return -1;
ret = q[0];
if ( size > 0 )
memcpy ( q, q+1, (size*sizeof(int)) );
q[pushIdx-1] = 0;
pushIdx--;
return ret;
}
int main()
{
QPush(&Q , 11);
QPush(&Q , 12);
QPush(&Q , 13);
printf ( "pop = %d ", QPop(&Q));
printf ( "pop = %d ", QPop(&Q));
}
Thx。
-内森
它在我所有的条件下都测试得很好[platform latest Linux gcc],因此我正在寻找一个可能会损坏的机箱。根据
memcpy()
的手册,内存区域不得重叠。但是,你的记忆区域会。对于重叠区域,您应该使用memmove()
。为什么不尝试做一个自动化测试,例如使用CUnit?听起来这个问题可能更适合于。出于某种莫名其妙的原因,您可以传递队列,但保留顶部索引作为全局变量。那么,索引可以放在哪里?C在typedef结构中不能有静态成员?我试图替换int Q[5];使用typedef结构{int-Event;int-pushIdx;}EventQ[5];但是在这种情况下,索引会在每个元素中重复,我不喜欢你把它倒过来。队列由两部分组成:(1)索引和(2)元素数组。这意味着您的struct EventQ
应该包含两个字段:索引int pushIdx
和元素数组int Event[5]
。任何东西都不应该是静态的。