一个段错误,知道是指针引起的,但是不知道为什么
typedef char* Frame;
typedef struct node* PNode;
typedef struct node{
Frame frame;
PNode next;
}Node;
typedef struct{
PNode front;
PNode rear;
int size;
pthread_mutex_t q_lock;
pthread_cond_t cond;
}Queue;
Queue *initQueue(){
Queue *pqueue=(Queue *)malloc(sizeof(Queue));
if(pqueue!=NULL){
pqueue->front=NULL;
pqueue->rear=NULL;
pqueue->size=0;
pthread_mutex_init(&pqueue->q_lock,NULL);
pthread_cond_init(&pqueue->cond,NULL);
}
return pqueue;
}
PNode enQueue(Queue *pqueue,Frame item){
PNode pnode=(PNode)malloc(sizeof(Node));
if(pnode!=NULL){
pnode->frame=item;
pnode->next=NULL;
pthread_mutex_lock(&pqueue->q_lock);
if(isEmpty(pqueue)){
pqueue->front=pnode;
}else{
pqueue->rear->next=pnode;
}
pqueue->rear=pnode;
pqueue->size++;
pthread_cond_signal(&pqueue->cond);
pthread_mutex_unlock(&pqueue->q_lock);
}
return pnode;
}
PNode deQueue(Queue *pqueue){
PNode pnode=pqueue->front;
pthread_mutex_lock(&pqueue->q_lock);
if(!isEmpty(pqueue)){
pqueue->size--;
pqueue->front=pnode->next;
free(pnode);
if(pqueue->size==0){
pqueue->rear=NULL;
}
}
pthread_mutex_unlock(&pqueue->q_lock);
return pqueue->front;
}
int main(int argc,char **argv){
Queue *queue=initQueue();
PNode pnode=enQueue(queue,"frame");
//printf("%s\n",pnode->frame);
Frame* item;
//PNode pnode2=deQueue(queue);//这样没有问题
pnode=deQueue(queue,item);//指针重新指向就会出错,出现段错误
printf("%d\n",sizeof(pnode));
//printf("%s\n",pnode2->frame);
return 0;
}
初学C,不是很懂指针,求指导
更新 - > 170310 1501
//代码已修改
PNode pnode=(PNode)malloc(sizeof(PNode));
//改为
PNode pnode=(PNode)malloc(sizeof(Node));
问题依旧,gdb调试在是在deQueue之后的printf那里抛出段错误
Program received signal SIGSEGV, Segmentation fault.然后在使用printf之前对pnode变量进行分析,发现pnode居然是NULL .....
更新 - > 170310 1507
猜想是deQueue获取enQueue出了问题,于是在deQueue之前打印了queue的size,发现queue size的确是1
更新 - > 170310 1522
问题找到了,问题在deQueue时,在返回队列头时,已经把队列头指向下一个元素了,而这里我只enQueue了一个,所以下一个就是NULL,返回NULL导致出错。
因此修改deQueue去掉free(pnode),然后返回pnode即可,不知道这样做对不对。
PNode deQueue(Queue *pqueue){
PNode pnode=pqueue->front;
pthread_mutex_lock(&pqueue->q_lock);
if(!isEmpty(pqueue)){
pqueue->size--;
pqueue->front=pnode->next; //这里指向了NULL
//free(pnode); //不释放
if(pqueue->size==0){
pqueue->rear=NULL;
}
}
pthread_mutex_unlock(&pqueue->q_lock);
//return pqueue->front;
return pnode;//返回当前队头
}