2013-12-10 39 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