c++ - 输入大值后 C 程序崩溃

标签 c++ arrays

我想要两个数组 AB 其中 A=[a0, a1, a2, …, aN-1], B=[b0, b1, b2, …, bN-1] 其中“N”是用户的输入。我想用 0 到 1 之间的随机数填充两个数组。然后我想将 aNbN 的乘积放入数组 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 ):

Example using STL algorithms

关于c++ - 输入大值后 C 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40273030/

相关文章:

javascript - 在react中更新状态时使用if时出错

c - 将二维数组从 Fortran 传递到 C

c++ - 在 C++ 类中分配给数组的正确方法是什么?

c++ - strlen 的奇怪用法

c++ - 视觉 C++ : No devirtualization in obvious cases?

c++ - FreeRTOS+STM32F4+CPP调用vTaskDelay时卡住

python - 列表和元组的行为不同

C++ int 到字节数组

Ruby 改变二维数组中的值

java - 在java中找出增加或减少的单调数组