程式裡一些易犯錯誤

2021-07-04 16:29:45 字數 1292 閱讀 6736

寫程式時經常會遇見些莫名其妙的錯誤,往往花了大把時間找了很久的bug,最終發現這些都是很小很小的問題,所以把這些可能問題記下來備忘。

struct sdata

;sdata* pmem = (sdata*)malloc(1024);

pmem->pdata = (char*)(pmem + sizeof(sdata));

pmem->length = 0;

程式中我本意是給申請的記憶體加個頭,便於管理,pdata指向可用記憶體位址,length記錄記憶體所用長度,但是沒有達到預期的效果,而且在運用中造成了嚴重的宕機。究其原因就是因為pmem->pdata = (char*)(pmem + sizeof(sdata));這句pmem做加法的時候所增長的長度遠遠大於預期,它是根據pmem所指的型別的長度增長的,即增長了sizeof(sdata)*sizeof(sdata)。如果想要位址實際增加sizeof(sdata),應該這樣

pmem->pdata = (char*)((char*)pmem + sizeof(sdata));
切記不要隨便對指標做加減操作!

2.整型提公升相關

在乙個表示式中,凡是可以使用整型的地方都可以使用帶符號或無符號的字元、短整型或整型位欄位,還可以使用列舉型別的物件。如果原始型別的所有值都可以用int型別表示,則其值將被轉換為int型別;否則將被轉換為unsigned int型別,這一過程稱為整型提公升。

unsigned char a = 0xf8;

unsigned char b = (~a)>>4;

unsigned char c = ~a;

c = c>>4;

unsigned char d = ((unsigned char)~a)>>4;

上面結果a=248,b=240,c=0,d=0,其中b的值不是所期望的,因為~a被整型提公升到了int,然後右移4位,最後被轉為unsigned char。

int i = -1;if(i < sizeof(i)) return true;else return false;
比較時i會被轉換為unsigned int即0xffffffff,所以結果返回false。

3.static

static儲存在靜態資料區,經常在函式中使用靜態區域性變數記錄一些資料,好處就是函式外不可見,而且其值一直是儲存著的以便下次進入函式再次訪問。但是要注意在多執行緒環境中這些static變數也是共享的,即可能同時被多個執行緒訪問並修改,切記切記,因為這個原因悲劇的除錯程式調了2天……

新手易犯錯誤集

include include define exp 0.00000001 int main else else if disc 0.0 else return 0 今天在寫這個 的時候犯了很多錯誤決定把它記下來,以後就不會犯了,1 今天寫的時候在else後面還加了小括號寫了判斷語句,後來經查得知。...

PHP易犯錯誤集錦

1 布林值問題 以下情況的值均為false 布林值 false 本身 整型值 0 零 浮點型值 0.0 零 空字串,以及字串 0 不包括任何元素的陣列 特殊型別 null 包括尚未賦值的變數 字串false var dump bool false bool true 型別自動轉換問題 字串all會轉...

matlab 程式設計 一些細節 常犯錯誤的彙總

x 1,2,3 y x x y ans 2 3 4 3 4 5 4 5 6 這裡matlab也會對不同size的矩陣之間進行broadcast操作 x size 1 3 y size 3 1 result size 3 3 對x在列的方向多複製二行,對y在行的方向多複製兩列 1,2,3 1,1,1,...