c 容易錯的小細節

2021-09-08 05:40:30 字數 1013 閱讀 5977

1、對陣列分配的記憶體進行置 0 ('\0'),因為記憶體中的值是隨機的。

在初始化時 char str[800]=;

如果是類的非靜態變數,不可以在初始化時置 0,就在構造方法中對其進行置0

memset(str, 0, sizeof(str));

2、sizeof 這個函式容易產生誤用

char * parr = new char[10];

int len_one = strlen(parr);

int len_two = sizeof(parr);

int len_three = sizeof(*parr);

cout << len_one << " and " << len_two << " and " << len_three << endl;

輸出結果:23 and 4 and 1

點評:第乙個輸出結果23實際上每次執行可能不一樣(因為沒有置'\0',分配記憶體中的值是隨機的),

這取決於parr裡面存了什麼(從parr[0]開始知道遇到第乙個null結束);

第二個結果實際上本意是想計算parr所指向的動態記憶體空間的大小,但是事與願違,

sizeof認為parr是個字元指標,因此返回的是該指標所佔的空間(指標的儲存用的是長整型,所以為4);

第三個結果,由於*parr所代表的是parr所指的位址空間存放的字元,所以長度為1。

3、sizeof與strlen的區別與聯絡

char arr[10] = "what?";

int len_one = strlen(arr);

int len_two = sizeof(arr); 

cout << len_one << " and " << len_two << endl; 

輸出結果為:5 and 10

詳細請看:

4、動態分配的變數,使用前加上非null判斷

csockettcpclient    *m_pclient;

if(m_pclient){

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...