2017-04-07 35 views
0

我试图用C编写一个通用的队列实现的初始化的一部分,这是我有:里面的malloc函数造成SIGSEV

struct queue{ 
    int head; 
    int tail; 
    int max_size; 
    int elem_size; 
    void **elements; 
}; 

void queue_init(struct queue** q, int max_size, int elem_size){ 
    *q = malloc(sizeof(struct queue)); 
    (*q)->head = (*q)->tail =0; 
    (*q)->max_size = max_size; 
    (*q)->elem_size = elem_size; 
    (*q)->elements = malloc(max_size * elem_size); 
} 

测试实现,我写了下面:

void klein_test(void){ 
    struct queue** qp; 
    queue_init(qp, 1, 1); 
    return; 
} 

int main(){ 
    klein_test(); 
} 

在试图运行这样的测试时,我得到了一个SIGSEV。用gdb检查执行结果,我看到错误信号是在queue_init的第一次调用malloc时生成的。这种行为的原因是什么?

+2

指针结构队列** QP;未初始化。 –

+0

'queue_init(qp,1,1);' qp没有在那个时候初始化。 – ThingyWotsit

+0

要载入本地(应该可能是'队列*'类型,您需要通过地址传递它:'queue_init(&qp,1,1);' – ThingyWotsit

回答

3

至少写

struct queue* qp; 
queue_init(&qp, 1, 1); 

也不清楚为什么会有声明

void **elements; 

,而不是仅仅

void *elements; 
+0

我需要使用调试器得出同样的结论:) –

+0

也许是因为'elements'必须是'max_size'项目的'elem_size'数组。顺便说一句,使用单指针连续内存; – LPs

+0

@Vlad from Moscow,你绝对正确的评论。只是等待SO让答案接受。谢谢! – bsam