Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这个简单的队列实现有什么问题吗?_C_Queue - Fatal编程技术网

C 这个简单的队列实现有什么问题吗?

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

假设数组总是连续的, 我想知道现在我正在做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++] = 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]
。任何东西都不应该是静态的。