繁体   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