前往
大廳
主題

C變數的唯讀(const)和改值(pointer)

Yang | 2023-08-26 17:05:23 | 巴幣 2 | 人氣 123

接續之前寫的
in 參數修飾詞 (C# 7.2以上支援)

C語言上常見寫成
const T& input

因為少了建立新的記憶體以及複製資料的動作,能減少程式的記憶體使用以及優化效能

但是,const看似唯讀,其實還是可以利用指標去修改變數值,要很小心

範例程式碼:

void ChangeConst(const int& source, const int& addValue)
{
    //如果直接改source值,編譯時會跳錯,但轉成指標後再改即沒問題

    int *ptr = (int *)&source;
    *ptr = source + addValue;
}

const int MyPID = getpid();

int main(const int argc, const char *argv[])
{
    printf("MyPID=%d\n", MyPID);
    printf("MyPID=0x%08X\n\n", MyPID);

    ChangeConst(MyPID, 1);

    printf("MyPID=%d\n", MyPID);
    printf("MyPID=0x%08X\n\n", MyPID);

    return EXIT_SUCCESS;
}

輸出:

MyPID=5226
MyPID=0x0000146A

MyPID=5227
MyPID=0x0000146B

ChangeConst可以是任何其他函式,尤其來自於第三方,要特別小心,要惡搞太容易

內部可以寫成平常時候都是正常的運算,只有在特別的條件或時間下,再搞破壞

神不知鬼不覺,因為平常時候測試都沒問題

在工作中遇到這種狀況,使用第三方函式庫的人員和單位會被檢討到翻,從此黑掉

要如何避免這種狀況?難,C的指標太強太萬能

一般是在呼叫第三方函式庫的前後,詳細紀錄log,出問題時再詳細檢查推敲,找到出問題的地方

但log紀錄太頻繁,就失去減少記憶體使用和優化效能的效果

參考資料

送禮物贊助創作者 !
0
留言

創作回應

Function
原來可以改,長知識了
2023-09-20 01:06:21

更多創作