指针混乱的指针

时间:2009-07-06 08:39:26

标签: c pointers

编辑:原因队列是2d是因为我需要一个Command指针,以便cmd可以等于NULL。 NULL ==(void *)。这是我迷茫的地方,为什么我来这里。 :)

为了帮助尝试找出我在Python中遇到的另一个问题,我在C中实现了一个小测试程序。虽然我知道一点,显然我很困惑。我正在尝试编写一个简单的队列,用于异步USB传输。由于队列中弹出的每个命令都是相同的,因此队列中的某些内容不正确。如果我将队列[1024] [0]写为队列[1024] [1],则该命令在两个不同的命令之间交替,并且程序在command_thread_main中崩溃。显然它没有注意到cmd应该是NULL。就我所知,更高[1]任何更高都没有影响。任何提示?

typedef struct Command {
    void (*cb) (char *data, int size);
    unsigned char *data;
    int size;
} Command;

struct Command queue[1024][0];

int queueEnd = 0;
int queueStart = 0;

static void queue_push(void (*cb), unsigned char *data, int size) {
    if (queueEnd >= 1024)
        return;
    queue[queueEnd]->cb = cb;
    queue[queueEnd]->data = data;
    queue[queueEnd]->size = size;
    queueEnd++;
}

struct Command * queue_pop(void) {
    if( queueStart > queueEnd )
        return NULL;
    return queue[queueStart++];
}

static void *command_thread_main(void *arg) {
    struct Command *cmd;
    while (!do_exit) {
        if(locked) continue;
        locked = 1;
        cmd = queue_pop();
        if(cmd != NULL)
            cmd->cb(cmd->data, cmd->size);
    }
}

4 个答案:

答案 0 :(得分:3)

我认为你有一个错误,你需要先修复它。您有一个2D数组命令,并将其中一个维度设置为零!

struct Command queue[1024][0];

当您访问队列时,您似乎将其视为一维结构。你应该声明为:

struct Command queue[1024];

答案 1 :(得分:2)

  • 你的意思是struct Command queue[1024];吗? (即,没有[0][1]或其他任何内容。)
  • queue_pop中,我认为您应该测试queueStart >= queueEnd
  • 您应该实现一个圆形数组。

现在你将struct本身存储在一个数组中,而不是指向它的指针。这是明智的。您需要将->更改为.,但是:

queue[queueEnd].cb = cb;
queue[queueEnd].data = data;
queue[queueEnd].size = size;

(因此queue_pop应返回struct Command类型的变量(不是struct Command *),并且主要代码也应相应更新。)

当然你也可以传递指针,但是有这么小的结构/队列,没有实际需要。

答案 2 :(得分:2)

正如其他人所指出的那样,2D队列肯定是错误的。你需要一个1D队列,我怀疑你想要的是一个指针数组:

Command * queue[1024];

我推荐你走一条路,稍微考虑一下这个问题,绘制一些图表,然后回过头来看清楚的代码和问题。

答案 3 :(得分:1)

另一个问题是你已经将队列声明为struct的数组,但是你通过使用解引用->运算符而不是成员资格将它用作指向结构的指针数组.一个。

我并不是说听起来很讽刺,但编译器警告标志(gcc的-Wall)是你的朋友。