首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 結構體數組傳參陷阱:值傳遞導致輸出全零

     編輯:程式設計綜合問答

現象

調用 printStudent(stu[i]) 時輸出正常;但若在函數調用**後**再賦值,輸出全為 0。

根因


// 錯誤:按值傳遞結構體,產生副本
void printStudent(Student s) { ... }

// 主函數
printStudent(stu[i]);  // 此時 stu[i] 尚未賦值,副本全為 0
stu[i] = inputStudent();  // 隨後賦值,但已錯過輸出時機

參數 i 傳遞無誤,問題在於 **函數調用順序** 與 **值傳遞語義**:調用瞬間結構體尚未初始化,副本捕獲了垃圾值/零值。

修正方案

  1. 先賦值,後調用:調整代碼順序。
  2. 改為引用/指針傳遞(推薦):
    void printStudent(const Student& s) { ... }  // 無拷買,見真實數據
    // 或
    void printStudent(const Student* s) { ... }
    

最佳實踐

  • 結構體/類對象**優先用 const 引用**作為函數參數,避免拷買開銷與語義陷阱。
  • 啟用編譯器警告 -Wuninitialized 可捕獲「使用未初始化變量」。
  • 現代 C++ 傾向將數據與操作封裝為類,print() 作為成員函數直接訪問 this,根除傳參問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved