我是學習C++的學生,我想了解null終止字符數組是如何工作的。假設我定義一個字符數組像這樣:C++ char數組null終結符位置
char* str1 = "hello world";
正如預期的那樣,strlen(str1)
等於11,它是空終止。
如果上述字符數組中的所有11個元素都填充了字符「hello world」,C++將null終止符放在哪裏?它實際上是分配一個長度爲12而不是11的數組,第12個字符是'\0'
? CPlusPlus.com似乎表明,11的人會需要是'\0'
,除非它確實是分配12
想我做到以下幾點:
// Create a new char array
char* str2 = (char*) malloc(strlen(str1));
// Copy the first one to the second one
strncpy(str2, str1, strlen(str1));
// Output the second one
cout << "Str2: " << str2 << endl;
此輸出Str2: hello worldatcomY╗°g♠↕
,我以爲是C++閱讀內存在指針char* str2
指向的位置,直到它遇到它認爲是空字符的內容。
但是,如果我再這樣做:
// Null-terminate the second one
str2[strlen(str1)] = '\0';
// Output the second one again
cout << "Terminated Str2: " << str2 << endl;
它輸出Terminated Str2: hello world
預期。
但不寫str2[11]
意味着我們正在寫的str2
分配的內存空間之外,因爲str2[11]
是第12個字節,但我們只分配11個字節?
運行此代碼似乎不會導致任何編譯器警告或運行時錯誤。這在實踐中是否安全?使用malloc(strlen(str1) + 1)
而不是malloc(strlen(str1))
會更好嗎?
不,11個字符中的一個確實是'\ 0' ...只是在開玩笑:-) – hirschhornsalz 2012-04-06 23:28:30
既然你在學習,從一開始就知道你正在學習的東西的名字是很重要的。表達式char * str1 =「hello world」;'沒有定義字符數組,而是指向一個文字的*指針*(順便說一句,從'const char *'到'char *'的轉換被棄用了,所以編譯器應該已經警告過你)。 * literal *本身是一個*常量*的*數組*,它帶有一個空終止符,但是您定義的變量是一個*指針*。 – 2012-04-07 00:24:18