全局变量和结构数组

时间:2013-12-10 12:16:42

标签: c struct calloc

我需要一个全局结构,它定义了一个队列数组。我想将指针用于教育目的。 在a.h中我定义了struct Queue:

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

和外部变量

extern Queue **queue;

a.c具有Queue * queue_new()函数来创建新队列。

现在b.c使用全局变量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 个答案:

答案 0 :(得分:0)

不是解决方案,但对于评论来说太大了。

我没有看到错误的,我认为你的问题在代码的其他地方 关于这一点,仅仅是很多值得怀疑的事情。

1.正如@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是否已定义并初始化?

答案 1 :(得分:0)

  

我做错了什么?

你唯一错误的就是如何解释调试器的输出。

  

当我在调试器内部检查**队列是什么样的时候,我只看到了   一个队列,而不是多个。

您只看到一个队列,因为这是**queue,因为queue只是指向Queue的指针的指针(queue的类型是{{ 1}}); struct Queue **的类型不会传达在第一个之后有更多queue指针的信息,因此调试器没有理由打印更多。

如果您的调试器偶然是GDB,您可以使用循环来打印所有队列:

Queue

您甚至可以为此目的定义命令:

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