簡體   English   中英

指針混亂的指針

[英]Pointer to pointer confusion

編輯:隊列為2d的原因是因為我需要Command的指針,以便cmd可以等於NULL。 NULL ==(無效*)。 但是,這是我感到困惑的地方,也是為什么我來這里。 :)

為了幫助找出我在Python中遇到的另一個問題,我正在用C實現一個小型測試程序。雖然我了解一點,但顯然我很困惑。 我正在嘗試編寫一個用於異步USB傳輸的簡單隊列。 隊列不正確,因為從隊列彈出的每個命令都是相同的。 如果我將queue [1024] [0]寫為queue [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);
    }
}

我認為您需要先修復一個錯誤。 您有一個二維命令數組,並將其中一個維設置為零!

struct Command queue[1024][0];

當您訪問隊列時,您似乎將其視為一維結構。 您應該將其聲明為:

struct Command queue[1024];
  • 你不是說struct Command queue[1024]; (也就是說,沒有[0][1] 。)
  • 我認為在queue_pop您應該測試queueStart >= queueEnd
  • 您應該實現一個循環數組。

現在,您將結構本身存儲在數組中,而不是指向它的指針。 那是明智的。 您需要將->更改為. 雖然:

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

(因此queue_pop應該返回struct Command類型的變量(而不是struct Command * ),並且還應相應地更新主代碼。)

當然,您可以傳遞指針,但是由於結構/隊列如此小,因此沒有實際需要。

正如其他人指出的那樣,二維隊列肯定是錯誤的。 您需要一個1D隊列,我懷疑您想要的是一個指針數組:

Command * queue[1024];

我建議您采取一種方法,對問題進行一些思考,繪制一些圖表,然后返回更清晰的代碼和問題。

另一個問題是,您已將queue聲明為struct的數組,但是您通過使用dereferencing- ->運算符而不是membership將其用作指向結構的指針的數組. 一。

我的意思不是嘴,但編譯器警告標志( -Wall用於gcc)是您的朋友。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM