在查找字符的频率期间由于更改数组的大小而导致的问题

问题描述

#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 ++中的数组将不会初始化,并且可以包含任意数据。使用未初始化的值将导致未定义的行为。

为什么更改数组的大小会更改任何内容?

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

在这种情况下,我想编译器会将更大的数组存储在另一个位置,而这个位置恰好包含零。

修改

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