对于n=3
和a={1,2,3},b={4,5,6}
,它应该计算1*4+2*5+3*6
。
我不明白为什么会这样,因为p是一个指针,而p=produs(a,b,n)
意味着p的地址变成了produs返回的值。
#include <stdio.h>
#include <conio.h>
void citire(int *x,int *n)
{
for(int i=1; i<=*n; i++)
scanf("%d",&x[i]);
}
int produs(int *a,int*b,int n)
{
int produs=0;
for(int i=1;i<=n;i++)
produs=a[i]*b[i]+produs;
return produs;
}
int main()
{
int n;
int*p;
scanf("%d",&n);
int *a=(int*)malloc(n*sizeof(int));
int *b=(int*)malloc(n*sizeof(int));
citire(a,&n);
citire(b,&n);
p=produs(a,b,n);
printf("%d",p);
return 0;
}
最佳答案
当您这样做时:
size_t size = 10;
int* x = calloc(size, sizeof(int));
您将得到一个包含10个项目的数组
x
,索引为0..9,而不是1..10。在这里,calloc
用于使请求的内容更加清晰,而不是进行可能是神秘的或钝的乘法。因此,要迭代:
for (int i = 0; i < size; ++i) {
x[i] ...
}
由于假设数组是1..N而不是0 ..(N-1),所以您的代码中存在许多偏离一的错误。
将所有内容放在一起并清理代码将产生:
#include <stdio.h>
#include <stdlib.h>
void citire(int *x, size_t s)
{
for(int i=0; i < s; i++)
scanf("%d", &x[i]);
}
int produs(int *a, int* b, size_t s)
{
int produs = 0;
for(int i = 0; i < s; i++)
produs = a[i] * b[i] + produs;
return produs;
}
int main()
{
int n;
scanf("%d",&n);
int* a = calloc(n, sizeof(int));
int* b = calloc(n, sizeof(int));
citire(a, n);
citire(b, n);
// produs() returns int, not int*
int p = produs(a,b,n);
printf("%d", p);
return 0;
}
您在不属于指针的地方使用指针。在C语言中,将指针传递给单个值的意思是“这是可变的”,但是您无需更改这些值,因此不需要或不建议使用指针。
尝试将
size_t
用作“事物大小”类型。这就是整个C语言中使用的值,并且它是一个无符号值,因为负索引或数组长度没有任何意义。关于c - 有人可以向我解释一下吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59093879/