“可变大小的对象可能未初始化” - 这是什么意思,为什么我会收到这种类型的错误?

问题描述

vector<string> commonChars(vector<string>& words) {
    int count[words.size()][26] = {}; 
    //getting error? 
    //error: variable-sized object may not be initialized

    string ele;
    vector<string> result;
    for(int s1=0; s1<words.size(); s1++){
        for(int s2=0; s2<words[s1].size(); s2++){
            count[s1][words[s1][s2]-97]++;
        }
    }
    for(int s=0; s<26; s++){
        int small = count[0][s];
        for(int i=1; i<words.size(); i++){
            small = min(small,count[i][s]);
        }
        while(small-- > 0){
            ele = (char)(s+97);
            result.push_back(ele);
        }
    }
    return result;
}

在线int count[words.size()][26] = {};

错误:可能无法初始化可变大小的对象

谁能帮帮我?这是什么错误

解决方法

本声明

int count[words.size()][26] = {};

声明可变长度数组,因为表达式 words.size() 的值不是编译时常量。

变长数组不是标准的 C++ 特性。似乎使用的编译器有自己的语言扩展,允许使用 VLA。

尽管如此,您不能在声明中初始化这样的数组。

所以你需要写

int count[words.size()][26];

然后您可以使用例如 C 函数 memset 或标准算法(如 std::fillstd::generate)来初始化数组。

实际上不需要在你的函数中声明一个二维变长数组。至少你可以使用像

这样的一维数组
int count[26] = {};

并使用它来处理向量中的每个字符串。

但是使用标准容器 std::map<char,size_t> 而不是数组会更好。