2013-12-10 88 views
0

我需要一個全局結構,它定義了一個隊列數組。我想用教育目的的指針。 內部A.H我所定義的結構隊列:全局變量和結構數組

typedef struct Queue 
{ 
    int size; 
    q_elem *root; 
    q_elem *last; 
} Queue; 

和外部可變

extern Queue **queue; 

交流轉換器所具有的功能隊列* queue_new()來創建一個新的隊列。

現在b.c使用全局變量Queue ** queue;我想創建一個隊列數組。

我想什麼:

queue = calloc(num_queues, sizeof(Queue*)); 
int i; 
for(i=0; i < num_queues; i++){ 
    queue[i] = queue_new(); 
} 

但它似乎沒有當我檢查我的調試器中正常工作。我究竟做錯了什麼?

Queue* queue_new() { 

    Queue *newQ = (Queue*) malloc(sizeof(Queue)); 
    if (newQ == NULL) 
     return NULL; 
    *newQ = (Queue) {0, NULL, NULL}; 
    return newQ; 
} 
+2

它是如何不起作用是否正確? – user694733

+1

當我檢查調試器內部時,_it的含義似乎並不正確。 – Rohan

+1

我認爲這可能是你在queue_new() – Marco

回答

0

不是一個解決方案,但太大的意見。

我什麼都看不到錯了,我認爲你的問題是在代碼的其他地方。
只是很多有疑問的事情作爲一個供參考。

1.As @Rohan說,它怎麼不起作用?

2. int size;應該是size_t size;

3.OP沒有顯示Queue **queue;我假設有一個Queue **queue;某處。在靜態空間中,它將被初始化爲0.更好地將其明確初始化爲NULL

4.「......創建一個隊列數組」實際上是「創建一個隊列指針數組」。

5.有趣的是,你有一個NULL檢查malloc(),但不是queue = calloc()

6. int i;size_t i;

7. Queue *newQ = (Queue*) malloc(sizeof(Queue));:不需要鑄造(Queue*)。代替

8.建議Queue *newQ = malloc(sizeof(*newQ));

9. Queue* queue_new()應該是Queue* queue_new(void)

10. num_queues在哪裏定義和初始化?

0

我在做什麼錯?

你做錯了唯一的事情是你如何解釋你的調試器的輸出。

當我在調試器裏面檢查**隊列的樣子時,我只看到 一個隊列,而不是多個隊列。

你只看到一個隊列,因爲這是**queue,由於queue只是一個指向一個指針Queue(的queue類型爲struct Queue **); queue的類型不傳達第一個指針後面有更多Queue指針的信息,因此調試器沒有理由打印更多。

如果碰巧你的調試器是GDB,你可以使用一個循環來打印所有隊列:

(gdb) set $i = 0  
(gdb) while ($i < num_queues) 
>p *queue[$i++] 
>end 

你甚至可以爲此定義一個命令:

(gdb) define pp 
Type commands for definition of "pp". 
End with a line saying just "end". 
>set $i = 0  
>while ($i < $arg1) 
>p *$arg0[$i++] 
>end   
>end   
(gdb) pp queue num_queues