鍍金池/ 問答/C  C++/ C語言指針問題

C語言指針問題

需求:
C語言實(shí)現(xiàn)生產(chǎn)者 - 消費(fèi)者模型

  • student_queue隊(duì)列
  • producer線程
  • consumer線程

問題:
從隊(duì)列中獲取數(shù)據(jù)時(shí),執(zhí)行student_queue_get()函數(shù)后,student沒有被賦值

  • 在student_queue_get()函數(shù)中時(shí),student被正確賦值
  • 執(zhí)行完 student_queue_get() 之后,student被重新賦值(Student student聲明時(shí)的狀態(tài))

看代碼:

  • student_queue.c 隊(duì)列部分
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 入口函數(shù)部分
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);
}
回答
編輯回答
夢(mèng)一場

函數(shù)外定義student指針,函數(shù)內(nèi)傳入student指針的地址

2017年7月18日 16:50
編輯回答
殘淚

這是因?yàn)閟tudent_queue_get()中對(duì)參數(shù)student的修改沒有傳遞到外面。

void *thread_run(void *userdata){
    for(;;){
        Student student;//假設(shè)其地址為A
        student_packet_get(&queue, &student);//將地址A傳入函數(shù)
        //...
    }
}

int student_queue_get(StudentQueue *queue, Student *student){//student為地址A
    //student = queue->front; 錯(cuò)誤,將變量student賦為地址queue->front,對(duì)地址A內(nèi)部的值沒有影響
    *student = *(queue->front);//A處的值被改變
    //...
}

本質(zhì)上還是pass by value的問題

2017年11月3日 12:40