我需要一个全局结构,它定义了一个队列数组。我想将指针用于教育目的。 在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;
}
答案 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