用于简单向量操作的 C++ 分段错误核心转储

C++ Segmentation fault core dumped for simple vector operation

我有以下代码c++代码

#include <vector>
#include <iostream>

using namespace std;

#define for_loop(upper_bound) for (int i=0;i<upper_bound; ++i)

// #define SHOW_VECTOR(vec_in) for(int j=0;j<vec_in.size();j++){ cout << vec_in[j] << " " << endl;};


int main(){
    int dim_1=10;
    int dim_2=3;

    int outer_i;
    // vector variable declared here to have 10 values
    vector<vector<int>>vec_var(dim_1);

    for_loop(dim_1){
        outer_i = i;
        for_loop(dim_2){
            cout << outer_i << " " << i << endl;

            vec_var[outer_i][i]=103;    
        }
    }

    return 0;
}

当我尝试 运行 时,出现以下错误:

Segmentation fault (core dumped)

您需要调整外向量和内向量的大小

vector<vector<int>> vec_var(dim_1, vector<int>(dim_2));
//                                 ^ inner vector default size

否则,如所写,如果大小为 dim_1,则您有一个外部向量,但所有内部向量都是空的。

顺便说一句,因为我注意到您随后用常数值填充向量,所以您也可以一步完成所有操作

vector<vector<int>> vec_var(dim_1, vector<int>(dim_2, 103));
//                                                    ^ default of inner vector elements

下标 std::vector 不会导致创建该元素位置。您需要调整大小,push_back,或以其他方式向矢量添加元素!您为超出范围的内容编制了索引。

外部向量是使用构造函数参数定义的,该参数将其大小设置为 dim_1,但每个内部向量都没有任何元素。所以跟进:

for (auto& inner : vec_var)  inner.resize(dim_2);

此外,建议使用内置的基于范围的 for 循环而不是您的宏。你需要在外循环中手动保存索引说明你的宏并不是最方便的!

int main()
{
constexpr int dim_1=10;
constexpr int dim_2=3;

vector<vector<int>>vec_var(dim_1);

for (auto& outer : vec_var) {
    outer.resize (dim_2);
    for (auto& inner : outer) {
        inner=103;    
    }
}

return 0;
}

但说真的,这不正常。您可能应该使用 push_back 添加值,而不是调整它的大小,然后按顺序为每个元素下标。

你只设置了外向量的维度。您还需要设置内部向量的维度。

#include <vector>
#include <iostream>

using namespace std;

#define for_loop(upper_bound) for (int i=0;i<upper_bound; ++i)

// #define SHOW_VECTOR(vec_in) for(int j=0;j<vec_in.size();j++){ cout << 
vec_in[j] << " " << endl;};


int main(){
  int dim_1=10;
  int dim_2=3;

  int outer_i;
  // vector variable declared here to have 10 values
  vector<vector<int>>vec_var(dim_1);

  for_loop(dim_1){
      outer_i = i;
      vec_var[outer_i].resize(dim_2); // ADD THIS
      for_loop(dim_2){
        cout << outer_i << " " << i << endl;

        vec_var[outer_i][i]=103;    
      }
  }

  return 0;
}