指针引起的段错误?

一个段错误,知道是指针引起的,但是不知道为什么


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;//返回当前队头
}
阅读 2.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进