首页 文章

如何正确地求和数组的元素w / out得到大的随机输出

提问于
浏览
1

我写了两个函数并在main中调用函数 .

函数1 - 我编写了一个函数,它返回void并获取一个int *(指向整数数组的指针)或int [],以及int(表示大小) . 该函数需要将数组的所有元素初始化为非零值 .

函数2 - 我编写了另一个函数,它返回int并获取const int *(指向整数数组的指针)或int [],以及int(表示大小) . 该函数应该对数组的所有元素求和并返回总和 .

在main中,我定义了一个大小为5的整数数组 . 在main中调用函数1来初始化数组的值 . 在main中调用函数2来获取总和并将总和的值打印到控制台 .

My problem is the program runs but the print out for sum we are getting is a large (in the millions), random, number and is not the expected answer of 15. Anyone who can help us get the correct answer would be greatly appreciated

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma warning(disable: 4996)

void func1(int* ptr, int size);
int func2(const int* ptr, int size);

int main()
{
    int grid[5];

    func1(grid, 5);
    func2(grid, 5);
}

void func1(int* ptr, int size)
{
    *ptr = 1, 2, 3, 4, 5;
}

int func2(const int* ptr, int size)
{
    int sum;

    sum = ptr[0] + ptr[1] + ptr[2] + ptr[3] + ptr[4]; // *(ptr + 0); putting an asterisk makes it so that it changes the entire "ptr" value and the "[0]" value

    printf("\n\nThe sum of the integers in the array is %d.\n\n", &sum);
}

2 回答

  • 4
    *ptr = 1, 2, 3, 4, 5;
    

    不会做你认为它做的事情 . 它实际上计算所有整数常量,但将 ptr[0] 设置为 1 (有关更多详细信息,请参阅逗号运算符),将所有其他常量保留为任意值 .

    请注意,它没有评估 *ptr = (1, 2, 3, 4, 5) (将 *ptr 设置为 5 ),但实际上正在评估 (*ptr = 1), 2, 3, 4, 5 - 这是有效的,因为像 42 这样的东西实际上是一个有效的C语句,尽管不是很有用 .

    如果您尝试将数组设置为增加值,请使用以下内容:

    for (int i = 0; i < size; i++)
        ptr[i] = i + 1;
    

    您可能还想在对值进行求和时这样做,因为它应该取决于传入的大小而不是仅仅总和五个值:

    int sum = 0;
    for (int i = 0; i < size; i++)
        sum += ptr[i];
    

    此外,您打印的值不是总和,它是包含总和的变量的地址(一个体面的编译器会警告您这一点) . 您应该在 printf 而不是 &sum 中使用 sum .

    而且,作为最后一点, func2 的签名表明你应该实际返回总和而不是仅仅打印它 . 所以我建议从该函数中删除 printf 并简单地执行:

    return sum;
    

    然后你可以将 printf 放入调用者( main ),如下所示:

    int main(void)
    {
        int grid[5];
    
        func1(grid, sizeof(grid) / sizeof(*grid));
        int sum = func2(grid, sizeof(grid) / sizeof(*grid));
        printf("The sum of the integers in the array is %d.\n\n", sum);
        return 0;
    }
    

    注意使用 sizeof(grid) / sizeof(*grid) ,它基本上是 grid 中的数组元素的数量 - 这将允许您通过简单地将其在一个地方更改为 int grid[42] 来调整 grid ,并且仍然使所有代码都使用更新的大小 .

    对你的代码来说实际上并不是必需的,但是最好尽早养成良好的编程习惯(对于你的函数更具描述性的名称也可能是一个好主意) .

  • 2

    *ptr = 1, 2, 3, 4, 5; 指定 ptr[0] 值并将其他点单元化,所以当你总结它时,它将是随机存储器 .

    您应该像这样使用 for 进行初始化

    for(int i=0;i<size;i++)
       {
              ptr[i] = i+1;
       }
    

    和类似的方法来总结它 .

相关问题