编写了一个将两个数组相乘的程序,如下所示:
uv=u1v1+u2v2+u3v3+。。。un*vn
在从用户那里得到这两个数组之后;信号:分段故障(堆芯转储(";错误
这是代码:
#include <stdio.h>
int scalar_product(int vectorU[], int vectorV[], int vectorLength) {
int i, sum = 0;
for (i = 0; i < vectorLength; i++)
sum += (vectorU[i] * vectorV[i]);
return sum;
}
void userInterface() {
int vectorLength = 0, i;
printf("Please enter the length of the vectors: ");
scanf("%d", &vectorLength);
int vectorU[vectorLength], vectorV[vectorLength];
printf("nVector U:");
for (i = 0; i < vectorLength; i++) {
printf("n%d) ", (i + 1));
scanf("%d", &vectorU[i]);
}
printf("nVector V:");
for (i = 0; i < vectorLength; i++) {
printf("n%d) ", (i + 1));
scanf("%d", &vectorV[i]);
}
printf(scalar_product(vectorU, vectorV, vectorLength));
}
main(void) {
userInterface();
}
printf的调用是不正确的
printf(scalar_product(vectorU, vectorV, vectorLength));
你至少需要写
printf( "%dn", scalar_product(vectorU, vectorV, vectorLength));
此外,最好像一样声明和定义函数
long long int scalar_product( const int vectorU[], const int vectorV[], int vectorLength) {
long long int sum = 0;
for ( int i = 0; i < vectorLength; i++)
sum += ( long long int )vectorU[i] * vectorV[i];
return sum;
}
要输出结果,您需要使用格式字符串"%lldn"
。。
类型long long int
用于避免溢出。
另一种方法是将函数返回类型声明为double
。
此外,您忘记指定函数main的返回类型int
。
此处:
printf(scalar_product(vectorU, vectorV, vectorLength));
。。。您未能指定printf
的格式。因此,它试图将scalar_product()
的结果解释为指向格式字符串的指针。未定义的行为结果。
如果你的编译器没有发出警告,那么你应该学习如何将警告级别调高,否则就会得到更好的编译器。如果您的编译器正在发出有关它的警告,那么请将此作为一个教训,即忽略编译器警告是不安全的。
也许你想要更像这样的东西:
printf("%dn", scalar_product(vectorU, vectorV, vectorLength));
作为一个次要的附加问题,您忘记了main()
的返回类型。编译器可能会将其视为返回int
,这是正确的做法,但这并不能使代码正确。您想要:
int main(void) {
// ...
有了这两项更改,您的程序在没有任何诊断的情况下为我编译,并且运行时没有错误,从而产生了我期望的结果。
至少,对于较小的矢量长度。如果您尝试非常大的向量,那么您可能会超出在堆栈上分配向量的可用空间。