C 低階錯誤

2021-06-08 14:08:27 字數 2267 閱讀 8428

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編...