C/C++程式設計教訓----資料結構的類型別名和memset
阿新 • • 發佈:2018-10-31
問題描述
學習微軟,我們經常會這樣定義資料結構, 並且定義了資料結構別名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
,這時候會聯想出來StructTest
和LPStructTest
,當你在頻繁使用這種方法的時候難免有一次會不小心選成了LPStructTest
避免問題
本文的宗旨是,儘可能的通過程式設計習慣,去避免掉這些低階錯誤。個人建議有兩個:
1. memset
呼叫的時候,重置的記憶體的大小使用變數的sizeof
結果,比如sizeof(sTest)
。
2. 如果再小心一點,就是儘量不要定義像上文提到的LPStructTest
這種類型別名。