[英]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.