1. 陣列下標訪問越界
2. 使用野指標
3. 記憶體拷貝忽略字串結尾標誌』\
0』4. 判斷無符號數是否小於0
5. 迴圈變數資料型別太小
6. 迴圈體內改寫迴圈變數
7. 混淆」==」與」=」
8. 函式區域性變數或引數過大,堆疊溢位
9. 資料型別不一致,變數或引數賦值出錯
10. 分支流程未釋放動態申請的記憶體
**案例:
(1)陣列下標根據計算得出
i = a – b ;
array[i] = 0 ; //使用前應該檢查i的合法性
(2)陣列下標通過函式得出
void main()
(3)陣列下標是迴圈變數
void main()
} (1)使用未分配空間的指標
void func()
} (2)記憶體空間釋放後指標未置null,記憶體指標仍被繼續使用
void* g_pbuf = null;
void atm_cellrecv(u8 *pbuf,u32 ullen)
}
void fun()
unsigned char c;
//c賦值為具體的迴圈次數
while(c-->=0)
unsigned char c;
unsigned short s;
//do something
//s > 255
for (c = 0; c < s; c++)
unsigned long i;
for (i = 0; i < 1024; c++)
} 如下例子的迴圈判斷條件中,將」==」誤寫成」=」,導致死迴圈。
bool result = true;
while(result = true)
程式設計規範要求將常量寫在等號左邊(如「true==result」),確保編譯時即可發現錯誤。
void function(void)
int main()
函式引數的輸入、輸出如果是乙個比較大的結構,要用指標帶入儲存輸入資料的記憶體位址,用指標帶入儲存輸出的記憶體位址,不要直接用值傳遞的方式輸入和輸出。如果函式的較大的輸入輸出使用值傳遞方式,對函式堆疊處理有較大的開銷。當資料接近或者大於堆疊空間的時候,就會出現堆疊溢位錯誤
如果是使用dopra平台,可以在v_configkernel.h檔案中找到預設的棧大小
#define vos_default_stack_size 0x200000
short int x;
int y;
void *p ;
p=&x;
*(int*)p=y;
x只有兩個位元組的空間,而int需要4個位元組的空間, 實際上己出問題了。還有乙個例子,會導致入參被踩:
int func(short int s, int* pi)
int main(int argc, char* argv)
呼叫函式func後, x = 0。
void function1(int nsize)
…//using the string pointed by p;
free(p);
p = null; }
當函式getstringfrom()返回零的時候,指標p指向的記憶體就不會被釋放。這是一種常見的發生記憶體洩漏的情形。程式在入口處分配記憶體,在出口處釋放記憶體,但是c函式可以在任何地方退出,所以一旦有某個出口處沒有釋放應該釋放的記憶體,就會發生記憶體洩漏。
記憶體分配方式有三種:
(1)從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數,靜態記憶體區。
(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc申請任意多少的記憶體,程式設計師自己負責在何時用free釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
一般我們常說的記憶體洩漏是指堆記憶體的洩漏。堆記憶體是指程式從堆中分配的,大小任意的(記憶體塊的大小可以在程式執行期決定),使用完後必須顯式釋放的記憶體。應用程式一般使用malloc,realloc等函式從堆中分配到一塊記憶體,使用完後,程式必須負責相應的呼叫free釋放該記憶體塊,否則,這塊記憶體就不能被再次使用,我們就說這塊記憶體洩漏了。
order by asc低階錯誤
問題 查詢emp表,顯示部門號為10的所有雇員的name job sal和 deptno,並以工資公升序進行排序。14 30 24 sql select ename,job,sal,deptno from emp order by asc select ename,job,sal,deptno fr...
低階錯誤集合
1.檔名打錯 2018.10.11 t1 freopen forging r stdin freopen forging w stdout 看著好像沒什麼不對?freopen forging.in r stdin freopen forging.out w stdout 100分慘變0分 總分150...
再現低階錯誤,該打!
ifdef cplusplus extern c endif 看著好像沒有啥錯誤,其實應該是extern c 大寫c 該打!編譯時一直提示錯誤 dlist.h 8 error language string c not recognize 還發現乙個gcc和g 的問題 gcc編譯.c檔案時,按照c編...