【发布时间】:2014-12-03 10:14:59
【问题描述】:
我正在尝试动态初始化队列。这是我的功能。
typedef struct{
int size;
int max_size;
short * eles;
} queue;
void dump_queue(queue *q)
{
//print a bunch of information
}
void init_queue(queue *q, int max_size)
{
q = (queue)malloc(sizeof(queue));
q->size = 0;
q->max_size = max_size;
q->eles = (short *)malloc(max_size * sizeof(short));
int i;
for(i = 0; i < max_size; i++)
q->eles[i] = -1;
dump_queue(q);
}
task_queue 是一个全局变量。例程的结构是这样的:(不是确切的代码)
//globally defined here but not initialized
queue * task_queue;
void init_scheduler()
{
init_queue(task_queue, 32);
dump_queue(task_queue);
//other staff
}
注意dump_queue有两个,一个是init_queue(),一个是init_queue之后。由于 task_queue 是 malloced,我希望 dump_queue 的两次调用应该给出相同的结果。但第二个实际上报告了一个 SIG_FAULT。
我查了一下,第二次调用dump_queue,task_queue其实是NULL。这是为什么呢?
【问题讨论】:
-
你 malloc 一些内存,然后扔掉指向它的指针。这就像把钱放在你的钱包里,把那个扔掉,然后问你的钱去了哪里。 (“它还在你的钱包里”就是答案。)
-
您不能通过没有间接的赋值来更改不同范围的值。
q = ...永远不会工作,你需要*q = ...。 -
这也行不通@perreal。他需要返回指针或传递
queue **参数,以便他可以为实际指针分配地址。更简洁的方法是在本地声明q并返回它,而不是使用指针到指针的参数通过参数传递它。 -
请将解决方案发布为您自己问题的答案,而不是编辑问题以包含答案。
-
我回滚了最后一次编辑;正如Introductory Tour 中所述,它使 Stack Overflow 作为“问答网站”的目的无效。
标签: c linux struct malloc system