信号:分段错误(核心转储)错误
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 以在堆栈上分配向量。
编写了一个将两个数组相乘的程序,如下所示:
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 以在堆栈上分配向量。