上週實習做fcitx輸入法時碰到乙個字元陣列的問題,因基礎的不紮實,導致經除錯了幾分鐘才發現問題所在。
字元陣列初始化常見有兩種格式:
char arr_test[10] =;
和
char arr_test[11] = "helloworld
";
為什麼是一樣的內容,兩個陣列的長度不一樣,乙個是10,乙個是11,因為預設在第二個陣列後面加上了字串結束符'\0'。此時,要對這兩個陣列分別利用strlen(arr_test)來求長度,答案會是多少呢?
第乙個陣列利用strlen(arr_test)來求,長度是不定的,為什麼?因為strlen沒有碰到'\0',不知道何時結束。
第二個陣列利用strlen(arr_test)來求,長度是10,為什麼?看下我以前的文章《c/c++之sizeof與strlen的區別》。
測試程式:
測試程式1:
#include usingnamespace
std;
intmain()
; cout
<<"
strlen(arr_test)=
"cout
<<"
sizeof(arr_test)=
"
}
輸出結果:
strlen(arr_test)= 15
sizeof(arr_test)= 10
測試程式2:
#include usingnamespace
std;
intmain()
輸出結果:
編譯通不過,error c2117: 'helloworld' : array bounds overflow
測試3:
#include usingnamespace
std;
intmain()
輸出結果:
strlen(arr_test)= 10
sizeof(arr_test)= 11
測試4:
#include usingnamespace
std;
intmain()
; cout
<<"
strlen(arr_test)=
"cout
<<"
sizeof(arr_test)=
"
}
輸出結果:
strlen(arr_test)= 10
sizeof(arr_test)= 11
這裡再提下sizeof和strlen:
sizeof求的是位元組數,注意int在32位機下佔4個位元組。
strlen所作的僅僅是乙個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃瞄,直到碰到第乙個字串結束符'\0'為止,然後返回計數器值。
字元陣列的初始化
有關字元陣列的初始化的若干問題 一 注意事項 1.字元陣列的初始化,初始化時賦予的自然是字元 要加單引號 2.賦予字元也可以通過賦予相應字元的ascii碼 去掉單引號 或賦予字串 只加雙引號 來進行。3.對字元陣列完全不進行初始化,則各元素隨機。4.對字元陣列進行不完全初始化,則從低位址 a i 中...
陣列初始化
cpp中陣列初始化方法 簡單的初始化 利用定義變數時賦初值進行初始化。int a 10 float f 10 char ch 5 大括號中的為初始值。較為複雜的初始化 利用memset函式初始化。memset函式用法 void memset void s,int c,size t n 將已開闢記憶體...
陣列初始化
flydream flydream c cat x.cpp include using namespace std int main int argc,char argv flydream flydream c flydream flydream c g g wall x.cpp x.cpp in ...