1. 程式人生 > >C/C++程式設計教訓----資料結構的類型別名和memset

C/C++程式設計教訓----資料結構的類型別名和memset

問題描述

學習微軟,我們經常會這樣定義資料結構, 並且定義了資料結構別名StructTest,和資料結構指標別名LPStructTest, 這樣定義也許讓程式的型別更加簡潔。

typedef _StructTest
{
    int iVal;
    char csStr[100];
}StructTest, *LPStructTest;

資料結構變數定義一般使用StructTest sTest這種形式,如果資料結構指標則用LPStructTest pTest

StructTest sTest;
LPStructTest pTest = &sTest;

下面說說博主碰到的坑,如下程式碼,定義了一個數據結構變數sTest

,用呼叫的memset初始化資料結構的記憶體為0也許你一下子就看出來錯誤,資料結構的大小,應該用sizeof(StructTest)而不是sizeof(LPStructTest)。 這時候你的程式也許會因為非完全的初始化,導致其出現一些未知的執行結果了。因為名字相似,程式碼審查也不太容易發現

StructTest sTest;
memset(&sTest, 0, sizeof(LPStructTest));

這種低階錯誤怎麼會發生呢,主要現在的編譯器或者外掛都帶有聯想提示的功能,比如當你用鍵盤敲打了Test,這時候會聯想出來StructTestLPStructTest,當你在頻繁使用這種方法的時候難免有一次會不小心選成了LPStructTest

。當然鍋不能甩給IDE或者外掛了,要從自身找原因。

避免問題

本文的宗旨是,儘可能的通過程式設計習慣,去避免掉這些低階錯誤。個人建議有兩個:
1. memset呼叫的時候,重置的記憶體的大小使用變數的sizeof結果,比如sizeof(sTest)
2. 如果再小心一點,就是儘量不要定義像上文提到的LPStructTest這種類型別名。