首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言 const 指標進階:以唯讀返回值保護資料不被修改

     編輯:關於C

問題背景

C 語言中,函數回傳指標時,實作端通常不希望呼叫端修改指標指向的資料。若直接回傳 `int*`,呼叫端可自由寫入 `*ptr = 999`,導致封裝破壞、資料竄改。解決方案:回傳 `const int*`,利用編譯器強制唯讀語意。

正確範例:回傳指向常數的指標

#include <stdio.h>

static const int* getConfigValue();  // 宣告:回傳 const int*

int main() {
    const int *val = getConfigValue();  // 接收端也需加 const
    printf("Value: %d\n", *val);        // ✓ 唯讀存取 OK
    // *val = 34;                       // ✗ 編譯錯誤:assignment of read-only location
    return 0;
}

const int* getConfigValue() {
    static int internal = 100;          // static 延長生命週期
    return &internal;                   // 回傳位址,類型自動轉為 const int*
}

編譯器錯誤示範

若在呼叫端嘗試修改:

const int *val = getConfigValue();
*val = 34;  // 錯誤 C3892: 'val' : you cannot assign to a variable that is const

編譯器直接攔截,保護執行期資料完整性。

關鍵設計要點

  1. 雙重 const 保護:函數宣告 `const int*` + 呼叫端變數 `const int*`,形成契約鏈。
  2. static 儲存類別:回傳的位址必須指向靜態/全域/堆記憶體,絕不可回傳區域變數位址(參考前文懸空指標問題)。
  3. 語意明確:`const int*` 表達「指向不可修改的 int」,區別於 `int* const`(指標本身不可修改)。

常見誤區對照

宣告含義允許修改指向資料?允許修改指標指向?
const int *p指向常數的指標✗✓
int *const p常數指標✓✗
const int *const p指向常數的常數指標✗✗

實務應用場景

  • API 設計:庫函數回傳內部唯讀配置、查表結果、字串常值。
  • 單例模式:`const Config* getInstance()` 防止外部竄改單例狀態。
  • 字串處理:`const char* getErrorMsg(int code)` 回傳靜態錯誤訊息字串。

總結

「回傳 `const` 指標」是 C 語言以編譯期靜態檢查替代執行期防護的經典手法。配合 `static` 確保物件生命週期,能以零成本實現介面層級的資料保護,是 C API 設計的必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved