c++ - 在查找字符频率期间由于更改数组大小而导致的问题
问题描述
#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++中的数组不会被初始化,可以包含任意数据。使用未初始化的值将导致未定义的行为。
为什么改变数组的大小会改变什么?
当您调用未定义的行为时,任何事情都可能发生。从技术上讲,删除所有文件将是“正确”的实现。
在这种情况下,我想编译器会将较大的数组存储在不同的地方,而这个地方恰好包含零。
编辑
初始化有一个例外:全局数组(和变量)将在程序开始时始终初始化为零。
推荐阅读
- metrics - 石墨不显示时间度量单位
- php - 如何使用 PHP 中的标准 for 循环打印排序数组?(不是 foreach 循环)
- python - 如何将地理编码结果写入 csv
- javascript - Javascript SonarQube 重构此函数以降低其认知复杂性
- c++ - 为什么这两个版本的代码给出不同的输出
- r - R中的Stata选项卡命令的等效项
- arcore - 对于 ARCore TramsformableNode,Pinch getture 在第一时间不起作用
- java - Switch 声明(价格以 5 美分递增)
- android - 当 Admob 横幅位于软键盘后面且不可见时,谷歌是否付费?
- css - background-size before IE9