C ++ strlen()初始化了char数组

时间:2017-04-11 21:36:37

标签: c++ c-strings strlen

快速提问。

我找不到为什么初始化的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获得了这些结果

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为基本的误解是 - 与其他语言不同 - 在C语言中,本地定义的变量不会使用任何值进行初始化,既不使用空字符串,也不使用0,也不使用任何<undefined>或其他任何值,除非您明确初始化它们。

请注意,访问未初始化的变量实际上是“未定义的行为”;它可能会导致“有趣”和非确定性结果,可能会崩溃,甚至可能会被忽略。

此类程序的一个非常常见的行为(虽然显然不能保证!)是,如果你写

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

然后test将指向一些内存,该内存以50字节的大小保留,但却填充了任意字符,不一定是\0 - 字符。因此,test可能不是“空”,因为第一个字符是\0,就像真正空字符串""一样。如果您现在通过调用test(实际上是UB,如上所述)访问strlen(test),那么strlen可能只是通过这个任意填充的内存,它可能会检测到{{1}在第一个\0字符内,或者在超过50字节后可能会检测到第一个\0

答案 1 :(得分:0)

你找到答案很好,但我想你必须明白这件事是如何运作的。

char test[MAX];

在这行代码中,您刚刚声明了一个MAX字符数组。在初始化之前,您将获得此数组中的随机值。 strlen函数只是遍历内存,直到找到0值。因此,由于数组中的值是随机的,因此该函数的结果是随机的。此外,您可以轻松地走出阵列并获得UB。

char test[MAX] = '';

此代码使用0值初始化'test'数组中的第一个元素,因此strlen将能够找到它。