我写了两个函数并在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);
}
答案 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;
}
和类似的方法来总结它。