2017-04-11 140 views
0

快速的問題。C++ strlen()初始化字符數組

我找不到爲什麼一個初始化字符數組返回此值。據我所知,的strlen()函數將只返回字符的數量內的陣列,而不是規模,但爲什麼它會返回,如果有一個不包含字符?

#include <iostream> 
#include <cstring> 
using namespace std; 

int main() 
{ 
    const int MAX = 50; 

    char test[MAX]; 
    int length = strlen(test); 

    cout << "The current \'character\' length of the test array is: " << length << endl; 
    // returns "61" 
     // why? 

    cin >> test; //input == 'nice' 
    length = strlen(test); 

    cout << "The new \'character\' length of the test array is: " << length << endl; 
// returns 4 when 'nice' is entered.  
// this I understand. 


    return 0; 
} 

這是一個項目中我發瘋了,因爲我會試圖用一個循環來將信息反饋到一個字符數組,但strlen的()總是會返回一個離譜的值,直到我初始化數組:

char testArray [50] ='';

代替

炭testArray [50];

我使用Visual Studio 2015年

多虧了這些成績!

+3

'char test [Max];'定義一個數組,但不是它的內容,在寫入之前它仍然未初始化。讀取未初始化的數據是未定義的行爲。這意味着'strlen'今天可以返回61,明天5,崩潰或者做任何其他事情。要清楚的是,'strlen'返回找到字符''\ 0''前的字符數。 –

+0

你期望發生什麼,爲什麼? –

+0

爲什麼你認爲一個未初始化的數組不能包含離譜值? – Kevin

回答

3

我認爲基本的誤解是 - 不像在其他語言 - 在C,局部定義的變量不與任何值初始化,既不是空字符串,也不能與0,也不能與任何<undefined>或什麼,除非你明確地初始化它們。

注意,在訪問未初始化的變量實際上是「不確定的行爲」;它可能導致「有趣的」和非確定性的結果,可能會崩潰,甚至可能被忽略。這種方案的

一個很常見的行爲(雖然明確不保證!)是,如果你寫

char test[50]; 
int length = strlen(test); 

然後test將指向一些內存,這是在50字節大小保留,又大大地任意字符,不一定是\0-字符。因此,test可能不會在這個意義上的第一個字符是一個\0因爲這將是一個真正的空字符串""「空」。如果你現在通過調用strlen(test)訪問test(這實際上是UB,因爲說的),然後strlen可能只是通過這個任意填充的內存,它可能在第一50字符內檢測\0,也可能檢測到第一\0多後已超過50字節。

+1

好吧謝謝澄清每個人,我現在明白,簡單地聲明一些東西並不意味着它已初始化 - 並試圖讀取未初始化的變量將與c + +擰謝謝斯蒂芬和弗朗索瓦,俄羅斯人,和其他諷刺傢伙。讓我大笑! –

+0

:-)如此熱情接受其中的一個答案,以便將主題標記爲已解決。 –

0

這是很好的,你已經找到你的答案,但你要明白,這怎樣事情的作品,我想。

char test[MAX]; 

在這行代碼中,您剛剛聲明瞭一個MAX字符數組。在你初始化它之前,你會得到這個數組中的隨機值。 strlen函數遍歷內存直到找到0值。所以,由於數組中的值是隨機的,因此該函數的結果是隨機的。此外,你可以輕鬆地走出陣列並獲得UB。

char test[MAX] = ''; 

此代碼initilizes與這樣的strlen將能夠找到它0值「測試」數組的第一個元素。

+0

它應該是'char test [MAX] =「」;',''''版本是一個語法錯誤 –

+0

這是真的,它只是一個錯字 –