求和大阵列返回C/C 中的0
Summing over large array returns 0 in C/C++
我有一个简单的示例,该示例总结为:
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;
}
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- 省略函数原型中的返回类型
- 受保护的嵌套结构不能用作派生外部类中的返回类型?
- 我无法理解此代码中的返回值
- 不理解此递归函数中的返回 (C++)
- MFC 的 OnInit() 函数中的返回 true 和返回 false 有什么区别
- 确定功能主体中的返回类型
- 为什么在.h中定义的私有结构需要.cpp文件中的返回类型中的范围
- C 功能参数中的返回参数
- 主语句中的返回语句上的堆损坏
- 更改基类方法在其派生类中的返回类型
- 使用投掷来替换C 非流动功能中的返回
- Clang修改析构函数中的返回值
- C 中的返回值
- 是否有一种方法可以通过C 中的OUT参数接收Python中的返回值
- x86-64 调用约定中的返回值
- 引用与对象作为运算符重载中的返回
- c 中的返回跟踪
- 如何存储UINT8_T*变量从C#中的C 返回