C语言指针问题

需求:
C语言实现生产者 - 消费者模型

  • student_queue队列
  • producer线程
  • consumer线程

问题:
从队列中获取数据时,执行student_queue_get()函数后,student没有被赋值

  • 在student_queue_get()函数中时,student被正确赋值
  • 执行完 student_queue_get() 之后,student被重新赋值(Student student声明时的状态)

看代码:

  • student_queue.c 队列部分
int student_queue_get(StudentQueue *queue, Student *student){
    student = queue->front;
    if(student){
        queue->front = student->next;
        if(!queue->font){
            queue->rear = NULL;
        }
    }
    // do something ...
    return 0;
}
  • demo.c 入口函数部分
void *thread_run(void *userdata){
    for(;;){
        Student student;
        student_packet_get(&queue, &student);
        
        LOGI("Student: { age: %d, name: %s}\n", student.age, student.name);// 打印的值: age = 0, name = 乱码
    }
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_run, NULL);
}
阅读 2.1k
2 个回答

这是因为student_queue_get()中对参数student的修改没有传递到外面。

void *thread_run(void *userdata){
    for(;;){
        Student student;//假设其地址为A
        student_packet_get(&queue, &student);//将地址A传入函数
        //...
    }
}

int student_queue_get(StudentQueue *queue, Student *student){//student为地址A
    //student = queue->front; 错误,将变量student赋为地址queue->front,对地址A内部的值没有影响
    *student = *(queue->front);//A处的值被改变
    //...
}

本质上还是pass by value的问题

函数外定义student指针,函数内传入student指针的地址

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题