【问题标题】:What is the difference between the two codes in C++? [closed]C ++中的两个代码有什么区别? [关闭]
【发布时间】:2018-10-27 15:22:18
【问题描述】:

我正在尝试 Hackerrank 上的问题哈希表:冰淇淋店。这是一个简单的问题,但这是我遇到的奇怪情况。数据结构的变化有什么影响? 案例一:

void whatFlavors(vector<int> cost, int money) {
    int ans1,ans2;
    vector<int> arr(100,0);          //notice this
    for(int i=0;i<cost.size();i++){
        if(arr[money-cost[i]]!=0){
            ans1=i+1;ans2=arr[abs(money-cost[i])];
            if(ans1>ans2){
                cout<<ans2<<" "<<ans1<<endl;
            }else{
                cout<<ans2<<" "<<ans1<<endl;
            }
            break;
        }
        else{
            arr[cost[i]]=i+1;
        }
    }
}

输出是:

案例 2: 代码:

void whatFlavors(vector<int> cost, int money) {
    int arr[100]={0}; //notice this
    int ans1,ans2;
    for(int i=0;i<cost.size();i++){
        if(arr[money-cost[i]]!=0){
            ans1=i+1;ans2=arr[abs(money-cost[i])];
            if(ans1>ans2){
                cout<<ans2<<" "<<ans1<<endl;
            }else{
                cout<<ans2<<" "<<ans1<<endl;
            }
            break;
        }
        else{
            arr[cost[i]]=i+1;
        }
    }

}

输出:

【问题讨论】:

  • 最可能的答案是由于缺少边界检查导致数组溢出导致的未定义行为。因为这个问题不符合minimal reproducible example 的所有要求,正如stackoverflow.com help center 中所解释的那样,不太可能有更完整的答案。如果你edit你的问题,删除所有令人讨厌的图像,并用minimal reproducible example补充它,那么也许会有更好的答案。
  • int arr[100]={0};int arr[100]={}; 相同。您只是将 0 分配给第一个元素,然后其他元素默认初始化,幸运的是它也是 0。
  • @MatthieuBrucherint arr[100]={0}int arr[100]={} 都需要用零初始化整个数组。见en.cppreference.com/w/cpp/language/aggregate_initialization
  • 但方式不同:如果初始化子句的数量小于成员数或者初始化列表完全为空,则剩余成员被值初始化。
  • C 标准中没有术语“值初始化”。目前尚不清楚您的意思是什么。该标准说,其余元素的初始化方式与静态存储持续时间对象的初始化方式相同,也就是说,为零。将某物初始化为零的所有方法都具有相同的效果,即将某物初始化为零。

标签: c++ c++11 data-structures stl


【解决方案1】:

让我们只注意这部分代码:

if(arr[money-cost[i]]!=0){
    ans1=i+1;ans2=arr[abs(money-cost[i])];

这意味着您期望money-cost[i] 对于i 的某些值是负数。因此,您最终会读取数组(向量或数组)之外的位置,这将导致在这两种情况下出现未定义的行为。

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 2021-06-28
    • 2010-09-14
    • 2012-01-30
    • 1970-01-01
    • 2021-12-17
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多