標籤:
對於C/C++中的 字元指標和字元數組,總是在碰到的時候無法確定而不得不現場測試,來確定末尾是否包含‘\0‘,函數到底如何使用等等。真是勞民傷財,現在總結一下:
字元指標的賦值
(1)指向一個字串常量
char *src = "abcded"; //這種方式由系統自動給該字元指標指定了一個記憶體中的位置,並且該位置的字元數組為{‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘d‘, ‘\0‘};
如果此時再次對 src賦值,src = "mmmt", 則src指向另外一個由系統指定的記憶體塊。這種方式賦值的src為一個指向字串常量指標,不能對src指向的位置的內容做改變的操作,即不能執行 *src = ‘a‘, *(src+1) = ‘t‘ 等操作;但是可以改變src指向的位置,即像之前的 src = "mmmt";
(2)指向一個字元數組
char tmp[4] = {‘a‘, ‘c‘, ‘e‘, ‘f‘};
char* src = tmp;
(3)使用 new,然後可以像字元數組一樣賦值,即指向一個字元數組
char* src = new char[10]; //這種方式由程式在堆記憶體上開闢了一個數組,並將地址賦值給src
字串常量和字元數組比較
(1)字串常量由系統自動分配一個記憶體地區,且該地區中的內容不能改變(即無法通過指向該字串的指標進行修改);
(2)字元數組或者為系統自動分配的全域資料區或棧上的記憶體,或者通過new操作來分配的堆上的記憶體,字元數組中的內容可變(即可以通過指向該字元數組的指標進行修改)。
(3)字元數組中不預設含有‘\0‘,除非明確賦值,而字串常量在末尾自動含有 ‘\0‘.
strcpy的使用
(1)用strcpy時候, 如果源字串是一個字元指標,則沒有問題,因為字元指標自動帶‘\0‘,在‘\0‘位置複製結束;
而如果源是一個字元數組(即將字元數群組轉換為字元指標來使用),則將會從字元數組的首地址開始複製,如果字元數組中明確指定了‘\0‘元素,則會在‘\0‘處停止,而若沒有‘\0‘元素,則程式可能會不停的複製,直到在程式的記憶體中碰到‘\0‘,這樣可能會得到不希望的結果。
(2)用strncpy的時候注意,這裡只管複製n個字元,如果前n個字元中含有‘\0‘,則會在‘\0‘處停止,否則,一直複製n個。
在寫程式的時候,如果目的字串之前沒有被memset清空,下次使用strncpy來為它賦值,則有可能它之前的長度大於n,則會導致不期望的結果。比如
char* dst = "abcdedf";
char* src = "12345";
strncpy(dst, src, 3);
則dst此時變為了 123dedf
c++字元指標