我想要两个数组 A
和 B
其中 A=[a0, a1, a2, …, aN-1]
, B=[b0, b1, b2, …, bN-1]
其中“N”是用户的输入。我想用 0 到 1 之间的随机数填充两个数组。然后我想将 aN
和 bN
的乘积放入数组 C[n]
,我还想要数组 C
中元素的总和。我不确定自己做错了什么,但应用程序运行正常,直到我输入一个像 100,000 这样的数字作为 N
,如果我输入像这样的大数字,应用程序就会崩溃。
这是我的 C++ 代码:`
int main(int argc, char **argv)
{
long long int n;
cout << "Hi, what do you want n to be?\n";
cin >> n;
long long int c = n - 1;
double A[c], B[c], C[c];
srand(time(NULL));
for (long long int i = 0; i <= c; i++) {
A[i] = ((double) rand() / (double) (RAND_MAX));
B[i] = ((double) rand() / (double) (RAND_MAX));
C[i] = (double) A[i] * B[i];
printf("%d %.15f\n",i, C[i]);
}
double sum = 0;
for (long long int i = 0; i <= c; i++){
sum += C[i];
}
printf("%d", sum);
return 0;
}
最佳答案
一个问题是:
双A[c], B[c], C[c];
这不是有效的 C++,因为数组必须有常量表达式来表示条目数。您正在使用编译器提供的扩展,即可变长度数组 (VLA)。问题很可能是由于数组太大而耗尽了堆栈空间。
取而代之的是,使用一些有效的 C++,即 std::vector :
long long int n;
cin >> n;
long long int c = n - 1;
std::vector<double> A(c), B(c), C(c);
但是,请注意 std::vector
仅限于 std::vector::max_size()
元素,因此您输入的值可能for n
可能太大而无法存储元素。重新考虑是否要超出 max_size()
值。
此外,您正在越界访问元素。这是使用 std::vector
优于数组的另一个领域。
for (long long int i = 0; i <= c; i++) {
A.at(i) = ((double) rand() / (double) (RAND_MAX));
B[i] = ((double) rand() / (double) (RAND_MAX));
C[i] = (double) A[i] * B[i];
printf("%d %.15f\n",i, C[i]);
}
你会看到当 i == c
时,对 A.at()
的调用保证会抛出一个 std::out_of_range
异常,表示您已超出索引 i
的范围。数组无法以任何一致性报告此类错误,因为数组越界是未定义的行为(代码可能“工作”、可能崩溃等)。
还有一个问题,就是这个:
printf("%d", sum);
因为 sum
是一个 double
,给 printf
一个与格式说明符不匹配的变量类型是未定义的行为。很有可能,您会看到打印出狂野的数字。格式说明符 %d
需要 int
类型,而不是 double
。所以更正是这样的:
printf("%lf", sum);
但由于您使用的是 C++,因此您应该简单地使用 std::cout
,因为它是类型安全的并且不会让您遇到这种类型的麻烦:
std::cout << sum;
当您删除所有错误并进行更正描述时,这里是一个 live example showing the output.
此外,这里有一个使用STL算法函数的替代方案,它比您现在的代码短得多,并且不需要声明3个 vector (只需要声明一个 vector ):
关于c++ - 输入大值后 C 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40273030/