C++ 无法找到未定义行为的原因

C++ 无法找到未定义行为的原因,c++,global-variables,undefined-behavior,C++,Global Variables,Undefined Behavior,在下面的程序中,我声明了一个全局变量(adj_matrix),以便在不同的函数中使用它。它在另一个函数(init_matrix)中定义 我用测试用例3 1 2测试了程序,收到了一个分段错误 3 1 2 YES Segmentation fault: 11 令人惊讶的是,当我取消注释construct\u matrix函数中的cout行时,分段错误消失了 对我来说,这看起来像是未定义的行为,但我无法找出它发生的原因和地点。请帮忙 节目如下: #include <iostream> #

在下面的程序中,我声明了一个全局变量(
adj_matrix
),以便在不同的函数中使用它。它在另一个函数(
init_matrix
)中定义

我用测试用例
3 1 2
测试了程序,收到了一个分段错误

3 1 2
YES
Segmentation fault: 11
令人惊讶的是,当我取消注释
construct\u matrix
函数中的
cout
行时,分段错误消失了

对我来说,这看起来像是未定义的行为,但我无法找出它发生的原因和地点。请帮忙

节目如下:

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int> > adj_matrix;

void init_matrix(int size, int val)
{
    adj_matrix.reserve(size);
    for (int i = 0; i < size; ++i)
    {
        adj_matrix[i].reserve(size);
        for (int j = 0; j < size; ++j)
        {
            if(i == j)
                adj_matrix[i][i] = 0;
            else
                adj_matrix[i][j] = val;
        }
    }
}

void construct_matrix(int size, int k, int val)
{
    // k denotes how many components we want
    for (int i = k - 1; i < size - 1; ++i)
    {
        adj_matrix[i][i + 1] = val;
        adj_matrix[i + 1][i] = val;
        // Uncommenting the following line resolves the seg-fault error
        // cout << i << endl;
    }
}

void print_matrix(int size)
{
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
            cout << adj_matrix[i][j];
        cout << endl;
    }
}

int main()
{
    int n, a, b;
    cin >> n >> a >> b;

    /*
    The solution uses the fact that atleast one of G or G complement is always connected.
    In cases where we have to show both are connected (not possible when n is 2 or 3), 
    we draw a simple graph connected v1 v2 v3...vn. The complement will be also connected (n != 2 and 3)
    */

    if(a == 1 && b == 1)
    {
        if(n == 2 || n == 3)
            cout << "NO" << endl;
        else
        {
            cout << "YES" << endl;
            init_matrix(n, 0);
            construct_matrix(n, 1, 1);
            print_matrix(n);
        }
    }
    else if(a == 1)
    {
        cout << "YES" << endl;
        init_matrix(n, 1);
        construct_matrix(n, b, 0);

        print_matrix(n);

    }
    else if(b == 1)
    {
        cout << "YES" << endl;
        init_matrix(n, 0);
        construct_matrix(n, a, 1);
        print_matrix(n);

    }
    else
        cout << "NO" << endl;

    return 0;
}
#包括
#包括
使用名称空间std;
向量调整矩阵;
void init_矩阵(int size,int val)
{
调整矩阵储备(规模);
对于(int i=0;i>b;
/*
该解决方案使用了这样一个事实,即至少G或G补码中的一个始终是连接的。
在我们必须显示两者都连接的情况下(当n为2或3时不可能),
我们画了一个连接v1 v2 v3…vn的简单图。补码也将连接(n!=2和3)
*/
如果(a==1&&b==1)
{
如果(n==2 | | n==3)

cout此代码中未定义行为的原因/原因之一是使用
运算符[]
访问尚未创建的向量元素

发件人:

类似的成员函数vector::at的行为与此运算符函数相同,只是vector::at被绑定检查,并通过抛出out_of_range异常来指示请求的位置是否超出范围

可移植程序不应使用超出范围的参数n调用此函数,因为这会导致未定义的行为

reserve
不会创建向量的新元素。它只是确保向量为它们分配了足够的内存。如果要创建可以访问的新元素,请使用
resize
()


我还建议在解决第一个问题后,再次检查所有向量访问是否存在越界索引。

此代码中未定义行为的原因之一是使用
运算符[]
访问尚未创建的向量元素

发件人:

类似的成员函数vector::at的行为与此运算符函数相同,只是vector::at被绑定检查,并通过抛出out_of_range异常来指示请求的位置是否超出范围

可移植程序不应使用超出范围的参数n调用此函数,因为这会导致未定义的行为

reserve
不会创建向量的新元素。它只是确保向量为它们分配了足够的内存。如果要创建可以访问的新元素,请使用
resize
()


我还建议在解决第一个问题后,再次检查所有向量访问是否存在越界索引。

adj_matrix.reserve(size);
不创建任何元素,只保留向量的大小。因此
adj_matrix[I].reserve(size)当
i
大于
adj_matrix.size()
adj_matrix.reserve(size);
不创建任何元素,只保留向量的大小。因此
adj_matrix[i]。reserve(size)当
i
大于
adj_matrix.size()时,
是未定义的行为

底层选民能解释我的问题出了什么问题吗?有趣的是,你能不能也展示一下你是如何编译代码的?这可能是因为
向量调整矩阵;
是单位化的,然后你试着在
初始矩阵中访问它,并在内部向量上调用
reserve
,从而导致c鲁莽。@andreee我用的是GNU g++.@VishaalShankar如果你能指出确切的细节,那会很有帮助。我不认为我所做的有什么错。下层选民能解释我的问题有什么错吗?有趣的是。你能不能也展示一下你是如何编译代码的?可能是因为
向量调整矩阵;
是单位序列化,然后您尝试在
init_matrix
中访问它,并在内部向量上调用
reserve
,这将导致崩溃。@andreee我使用了GNU g++。@VishaalShankar如果您能指出确切的细节,那将非常有用。我不认为我所做的有任何错误。