簡體   English   中英

C ++ strlen()初始化char數組

[英]C++ strlen() initialized char array

快速提問。

我找不到為什么初始化的char數組返回此值的原因。 我知道strlen()函數只會返回數組中的字符數量,而不是大小,但是如果其中沒有字符,為什么它將返回61

#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] ='';

代替

char testArray [50];

我使用Visual Studio 2015得到了這些結果

謝謝!

我認為基本的誤解是-與其他語言不同-在C語言中,本地定義的變量不使用任何值初始化,不使用空字符串,0或任何<undefined>或任何值初始化,除非您明確初始化它們。

注意,訪問未初始化的變量實際上是“未定義的行為”。 它可能導致“有趣”和不確定的結果,可能崩潰,甚至可能被完全忽略。

這種程序的一個非常普遍的行為(盡管顯然不能保證!)是,如果您編寫

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

然后test將指向一些內存,該內存保留為50個字節的大小,但仍填充有任意字符,不一定是\\0字符。 因此,在第一個字符為\\0的意義上,就像在真正的空字符串""一樣, test可能不會為“空"" 如果現在通過調用strlen(test) (實際上是UB, strlen(test)訪問test ,則strlen可能只是經過了這個任意填充的內存,並且它可能在前50字符中檢測到\\0 ,或者可能檢測到超過50個字節后,第一個\\0

找到您的答案很好,但是我認為您必須了解這件事是如何工作的。

char test[MAX];

在這行代碼中,您剛剛聲明了一個MAX字符數組。 您將在此數組中獲得隨機值,直到對其進行初始化。 strlen函數僅遍歷內存,直到找到0值。 因此,由於數組中的值是隨機的,因此此函數的結果是隨機的。 此外,您可以輕松地走出陣列並獲得UB。

char test[MAX] = '';

此代碼使用0值初始化“測試”數組中的第一個元素,因此strlen可以找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM