信号:分段错误(核心转储)错误

signal: segmentation fault (core dumped) error

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

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( "%d\n", 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;
}

要输出结果,您需要使用格式字符串 "%lld\n"..

类型long long int用于避免溢出。

另一种方法是将函数 return 类型声明为 double.

您还忘记指定函数 main 的 return 类型 int

此处:

  printf(scalar_product(vectorU, vectorV, vectorLength));

...您未能为 printf 指定格式。因此,它试图将 scalar_product() 的结果解释为指向格式字符串的指针。未定义的行为结果。

如果您的编译器没有发出警告,那么您应该学习如何提高警告级别以使其发出警告,或者获得更好的编译器。如果您的编译器 正在 发出有关它的警告,请将此作为一个教训,忽略编译器警告是不安全的。

可能你想要更像这样的东西:

  printf("%d\n", scalar_product(vectorU, vectorV, vectorLength));

作为一个小的附加问题,您忘记了 main() 的 return 类型。您的编译器可能将其视为 returning int,事实证明这是正确的做法,但这并不能使您的代码正确。你想要:

int main(void) {
    // ...

通过这两项更改,您的程序无需任何诊断即可为我编译,并无错误地运行,产生我期望的结果。

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