信号:分段故障(堆芯转储)错误



编写了一个将两个数组相乘的程序,如下所示:

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) {
// ...

有了这两项更改,您的程序在没有任何诊断的情况下为我编译,并且运行时没有错误,从而产生了我期望的结果。

至少,对于较小的矢量长度。如果您尝试非常大的向量,那么您可能会超出在堆栈上分配向量的可用空间。

最新更新