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