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

时间:2017-07-22 01:29:57

标签: c arrays pointers

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

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

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

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

我的问题是程序运行但是我们得到的打印输出是一个很大的(数百万),随机,数字,并不是15的预期答案。任何可以帮助我们得到正确的人答案将不胜感激

#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 个答案:

答案 0 :(得分: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];

此外,您打印的值不是总和,它是包含总和的变量的地址(一个体面的编译器会警告您这一点)。您应该在sum而不是printf中使用&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中数组元素的数量 - 这样您只需在中更改<{1}}即可调整grid的大小。 em>放置到int grid[42]之类的内容,并且所有代码仍然可以使用更新的大小。

对于您的代码而言,实际上并非必要,但最好早点进入良好的编程习惯(对于您的函数更具描述性的名称也可能是一个好主意)。

答案 1 :(得分:2)

*ptr = 1, 2, 3, 4, 5;指定ptr[0]值,并将其他点单位化,所以当你总结它时,它将是随机记忆。

您应该使用for这样初始化

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

和类似的方法来总结它。