分段故障:11;基于范围的循环

时间:2013-09-14 14:17:29

标签: c++ c++11 segmentation-fault

我正在用C ++编写一个小编程练习。目标是启动一个前32个指数为2的数组,然后输出它们。 使用普通for循环没有问题,但我尝试使用C ++ 11标准中引入的基于范围的for循环。 在编译期间,我收到警告“基于范围的循环是一个C ++ 11扩展[-Wc ++ 11-extensions]”。 运行程序我得到错误“Segmentation fault:11”,没有任何进一步的输出。

我已经知道elem变量以某种方式被破坏但我不知道如何。 希望你能帮助n00b:)

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    const int LAENGE = 32;
    long potenzen[LAENGE];

    for(int elem : potenzen)
    {
        potenzen[elem] = pow(2.0, (double) (elem + 1));
    }

    for(int elem : potenzen)
    {
        cout << endl;
        cout << potenzen[elem];
    }

    cout << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:7)

elempotenzen中分配了,而不是索引。您需要cout << elem;来打印数组的元素。并且为了填充数组,只需使用整数索引:

for (int i = 0; i < LENGTH; i++) { // ProTip #1: use English identifiers
    array[i] = 2 << i; // ProTip #2: don't use `pow()` when working with integers
}

关于编译器警告:在编译时使用-std=c++11-std=c++0x标志告诉编译器你打算使用C ++ 11特性(假设你使用GCC或clang - 我'我不确定其他编译器。)

答案 1 :(得分:3)

Ranged for loop wil给出元素值,而不是元素索引。

    potenzen[elem] = pow(2.0, (double) (elem + 1));

应该是

for(int i = 0; i < LAENGE; i++)
  potenzen[i] = 2 << i;

(有关转移,请参阅H2CO3的回答及其下面的评论)

请注意,您不能在此处使用foreach循环:

for(int& elem : potenzen)
{
    elem = pow(2.0, (double) (elem + 1));
}

当您在语句右侧访问未初始化的elem值时。

另外:

for(int elem : potenzen)
{
    cout << endl;
    cout << potenzen[elem];
}

应该是

for(int elem : potenzen)
{
    cout << endl;
    cout << elem;
}

因为elem将包含数组值。

答案 2 :(得分:1)

上面的答案正确地指出了代码中的问题,但是如果你想将数组索引作为元素值来设置它们,没有它们就会被初始化为不确定(垃圾)值;以下代码也是一个与您尝试的方法类似的解决方案:

#include <iostream>
#include <algorithm>

int main()
{
  constexpr auto count = 32;
  unsigned long long values[count] = { }; // initialise elements to 0
  auto i = 0;
  // fill them with their respective index values
  std::generate_n(values, count, [&i] { return i++; });
  for(auto &x : values)
  {
    // without casting the literal 2 would be treated as an int
    x = static_cast<unsigned long long>(2) << x;
    std::cout << x << std::endl;
  }
  return 0;
}

我使用unsigned long long而不是long,因为在许多系统上,long的大小是4个字节,但是2 ^ 32 = 4294967296 = 0x100000000 I.e。需要33位。此外,因为我们知道所有的值都是正的,所以使它无符号更有意义。