在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

C語言指針問題

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

  • student_queue隊列
  • producer線程
  • consumer線程

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

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

看代碼:

  • 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 入口函數(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);
}
回答
編輯回答
夢一場

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

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

這是因為student_queue_get()中對參數(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; 錯誤,將變量student賦為地址queue->front,對地址A內(nèi)部的值沒有影響
    *student = *(queue->front);//A處的值被改變
    //...
}

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

2017年11月3日 12:40