C++ strlen() 初始化的字符数组

C++ strlen() initialized char array

本文关键字:字符 数组 初始化 strlen C++      更新时间:2023-10-16

快速提问。

我找不到为什么初始化的 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] = '';

而不是

字符测试数组[50];

我使用Visual Studio 2015得到了这些结果

谢谢!

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

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

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

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

然后test将指向一些内存,该内存以50字节的大小保留,但填充了任意字符,根本不字符。因此,test可能不会像使用非常空的字符串""那样"空",因为第一个字符是一个。如果您现在通过调用strlen(test)(如前所述实际上是 UB)来访问test,那么strlen可能只是通过这个任意填充的内存,它可能会检测到前50个字符中的,或者它可能在超过50个字节后检测到第一个

很高兴你找到了答案,但我认为你必须了解这件事是如何工作的。

char test[MAX];

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

char test[MAX] = '';

此代码以 0 值启动 'test' 数组中的第一个元素,以便 strlen 能够找到它。