问题描述
#include <iostream>
using namespace std;
int main()
{
string s;
int hash[256];
getline(cin,s);
int max = 0;
char ch;
for (int i = 0; i < s.size(); i++)
{
hash[s[i]]++;
if (hash[s[i]] > max)
{
max = hash[s[i]];
ch = s[i];
}
else if (hash[s[i]] == max && ch > s[i])
{
ch = s[i];
}
}
cout << ch << " " << max;
return 0;
}
上面的代码用于查找给定字符串中字符的最大频率。问题是当我将数组初始化为零(int hash[256] = {0}
)(256,因为最大可能的字符数)时,代码可以正常工作,但是如果我不这样做,程序将不会输出正确的答案,而且如果我将其更改为(int hash[3000];
),代码也可以正常运行。更改尺寸后,我没有得到什么问题。
解决方法
首先:C ++中的数组将不会初始化,并且可以包含任意数据。使用未初始化的值将导致未定义的行为。
为什么更改数组的大小会更改任何内容?
当您调用未定义的行为时,任何事情都可能发生。从技术上来讲,删除所有文件都是“正确”的实现。
在这种情况下,我想编译器会将更大的数组存储在另一个位置,而这个位置恰好包含零。
修改
初始化有一个例外:程序开始时,全局数组(和变量)将始终以零初始化。