求和大阵列返回C/C 中的0

Summing over large array returns 0 in C/C++

本文关键字:中的 返回 阵列 求和      更新时间:2023-10-16

我有一个简单的示例,该示例总结为:

static uint64_t ySumSimple(uint32_t* arr, uint32_t* to) {
    uint64_t sum = 0;
    while (arr < to) {
        sum = sum + *arr;
        ++arr;
    }
    return sum;
}

并在主要方法中使用它:

using namespace std;
int main(){
    size_t size = 1000*1000;// len*loops;
    uint32_t * arr= (uint32_t *) malloc(size * sizeof(uint32_t));// random values here          
    auto sum = ySumSimple(arr,arr+size);
    cout <<" sum " <<  sum << endl;
}

这将返回真实总和(一些大数字(,如果尺寸= 1000*100,但是有100万个UINT返回0。/div>

由于您在C 中编程(请删除C语言标签(,您的行为不确定。

您拥有UB,因为虽然您分配的内存内容似乎是随机的,但其实际内容是不确定的。并使用(甚至仅读取(不确定数据导致UB。

所有这些以下值每个都保持零(0(。因此,他们的总和将为零!

*arr为零 *(arr+1)为零... *(arr+size)为零

总结将给出零。您需要在数组arr中分配值。

在下面找到校正的代码(包含数组元素值的分配(,总和为499999500000。

#include <iostream>
using namespace std;
static uint64_t ySumSimple(uint32_t* arr, uint32_t* to) {
    uint64_t sum = 0;
    while (arr < to) {
        sum = sum + *arr;
        ++arr;
    }
    return sum;
}

int main() {
    size_t size = 1000*1000;// len*loops;
    uint32_t * arr= (uint32_t *) malloc(size * sizeof(uint32_t));// random values here          
    //Assign Values into the array elements
    for(int i=0; i< size; i++)
        *(arr+i) = i;
    auto sum = ySumSimple(arr,arr+size);

    cout <<" sum " <<  sum << endl;
    return 0;
}