c++ - 创建邻接表时出现段错误

标签 c++ pointers struct

我正在为图形结构创建一个邻接表。下面是我的代码片段 当我在 gdb 中运行时出现“程序接收信号 SIGSEGV,段错误。std::_List_node_base::hook () 中的 0x0040340f”错误。有人可以指出代码中的错误吗。

struct graph{
    list<int> vertex;
}*v;

list<int>::iterator it;
cin>>num_vertices;

v = new  graph[num_vertices];

if (v == 0)
    cout << "Error: memory could not be allocated";

for(i=1;i<=num_vertices;i++)
{
    cin>>num_connected;
    for(j=1;j<=num_connected;j++)
    {
        cin>>m;
        (v+i)->vertex.push_back(m);
    }
}
for(i=1;i<=num_vertices;i++)
    for(it= (v+i)->vertex.begin();it!= (v+i)->vertex.end();it++)
        cout<<*it<<"->";

最佳答案

C++ 数组是从零开始的,因此应该使用 [0][num_vertices-1] 进行索引。如果您将循环更改为从 0 到 num_vertices-1

for(i=0;i<num_vertices;i++)

您的代码应该可以工作。

当前的失败大概是由于循环的最后一次迭代取消引用 (v+num_vertices) 引起的,这是数组之外的内存。写入您尚未分配的内存会产生未定义的行为,因此段错误不足为奇。

关于c++ - 创建邻接表时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290206/

相关文章:

c++ - 结构定义包含自身的静态实例?

c++ - 从内部函数内部使用外部函数中的变量

c++ - ISO C++禁止在结构内初始化成员

c - 在C中保存一个指针地址

c++ - 让 if 语句在 for 循环中工作(使用动态数组和指针)

c - 初始化一个包含指向结构体指针的结构体

c++ - 编写多线程异常安全代码

c++ - 如何使用 select 语句检索 sqlite 并分配给 vector 然后分配给字符串

在 vb.net 中调用 C 指针

swift - 我可以通过分配结构体变量来创建 Swift 中自定义对象的 "copy"吗?