输入大值后,C程序崩溃

时间:2016-10-26 22:19:05

标签: c++ arrays

我希望有两个数组AB,其中A=[a0, a1, a2, …, aN-1]B=[b0, b1, b2, …, bN-1]其中“N”将是来自用户的输入。我想用0和1之间的随机数填充两个数组。然后我想在数组aN中得到bNC[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;
}

3 个答案:

答案 0 :(得分:4)

一个问题是:

double 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()元素,因此您为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);

由于sumdouble,因此给printf一个与格式说明符不匹配的变量类型是未定义的行为。很可能,你会看到正在打印的野生数字。格式说明符%d需要int类型,而不是double。所以纠正就是这样:

  printf("%lf", sum);

但是既然你正在使用C ++,你应该只使用std::cout,因为它是类型安全的,不会让你陷入这种麻烦:

  std::cout << sum;

当您删除所有错误并进行更正描述时,此处为live example showing the output.

此外,这里有一个使用STL算法函数的替代方法,它比你现在的代码短得多,并且不需要声明3个向量(只需要声明一个向量):

Example using STL algorithms

答案 1 :(得分:3)

当你有一个大小为c的数组时,你可以访问元素0到c-1,而不是c!

所以你的循环应该是

for (long long int i = 0; i < c; ++i)

而不是

for (long long int i = 0; i <= c; ++i)

另外,对于大型c,考虑使用堆内存而不是堆栈内存,例如使用

A = new double[c];

而不是

double A[c];

此外,熟悉智能指针,如std :: unique_ptr和STL容器,如std :: vector。

答案 2 :(得分:0)

除了你的数组边界不足之外,由于&#34; i&lt; = c&#34;堆栈空间不足:数组放在堆栈上,堆栈大小有限。超过堆栈大小,程序将崩溃。默认堆栈大小取决于OS和OS设置。在Linux上,您可以使用&#34; ulimit -s&#34;。

进行更改
相关问题