首页 > 解决方案 > 在查找字符频率期间由于更改数组大小而导致的问题

问题描述

#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++arrayssize

解决方案


首先:C++中的数组不会被初始化,可以包含任意数据。使用未初始化的值将导致未定义的行为。

为什么改变数组的大小会改变什么?

当您调用未定义的行为时,任何事情都可能发生。从技术上讲,删除所有文件将是“正确”的实现。

在这种情况下,我想编译器会将较大的数组存储在不同的地方,而这个地方恰好包含零。

编辑

初始化有一个例外:全局数组(和变量)将在程序开始时始终初始化为零。


推荐阅读