分析:在函數內部不能改變指針指向的地址,。當TrunkHBDeactive函數調用SetTimeHandle函數獲取指針的時候,實際上pTime的值根本沒有改變,始終為一個空指針。
注:對函數參數所在的存儲單元的直接修改不會作用在函數之外,但是對參數存儲單元中存放的地址指向的存儲單元的修改,則會在函數之外起作用。
總結:函數內部不能修改指針指向的地址 TimerHandle,但可改變指針指向得知的內容 *TimerHandle:
分析:局部變量的內容存放在堆棧內,其所占用的空間在函數返回后會自動釋放,導致函數返回的指針指向了不可預知的內存。故要注意不要返回局部變量堆棧中的地址。
修改方法如下:傳入一個已經由上層函數分配好空間的指針,并在函數內部修改指針指向的內容。這樣就可以確保函數返回后,pData指針指向的內容仍然是有效的。
問題一:
問題二:
分析:大端序存儲順序:高地址存儲低位字節,低地址存儲高位字節;小端序存儲順序:低地址存儲低位字節,高地址存儲高位字節。函數對4字節序的修改只會修改2個字節,在大端序cpu中修改高位字節導致錯誤。
1,當目的結構的空間大于源結構的空間時,考慮越界問題。 2,當目的結構的空間小于源結構的空間時,考慮字節序(大小端)問題。 3,在把某些變量或數組或結構強制轉換為另一種結構體時,需要考慮字節對齊問題。 4,基本數據類型(char,int,short,long)的強制類型轉換比結構體之間的強制類型轉換更容易出現上訴情況。 5,不要將字符串常量強制轉換為字符指針(const char * —-> char *),以免導致改寫只讀數據的段錯誤。
問題一:
分析:ucCount不可能大于)xFF,導致死循環。故要注意,使用循環變量不能使用UC類型(unsigned char),最好使用US(unsigned short)或UL(unsigned long),避免循環邊界值大于255導致死循環。
問題二:
當ulTimeOutInMillSec非常大時,乘以100有可能導致溢出,乘法的結果會變成一個很小的值。
新聞熱點
疑難解答