链表实现中的C ++ Struct指针

时间:2014-11-12 03:45:26

标签: c++ pointers struct linked-list

任何人都可以帮忙解决这个问题(我猜是指针和内存分配问题 - 在运行时,如果删除//COMMENTED// cout statement结构的两个*in*out,代码将无效数据结构E虽然以相同的方式处理,但只有* in给出了所需的输出

struct V
{
      int al;
      V *next;
};

struct E
{;
      int id;
      V *in;
      V *out;
};

void init(E *edges, int count)
{
    int i = 0;

    int id = 1;
    while (i < count)
    {
        edges[i].id = id;
        edges[i].out = new V;
        edges[i].out->al = 0;
        edges[i].out->next = NULL;
        edges[i].in = new V;
        edges[i].in->al = 0;
        edges[i].in->next = NULL;
        i++; id++;
    }
    i =0;
    while (i < count)
    {
        cout<<"Edges are:"<<endl;
        cout<<"Edge In "<<i<<" is "<<edges[i].in->al<<endl;
        //cout<<"Edge Out "<<i<<" is "<<edges[i].out->al<<endl;
        i++;
    }
}

int main()
{
       int counter=5;
       E *edges = new E[counter];
       init(edges,counter);
}

2 个答案:

答案 0 :(得分:1)

见这一行

edges[i].id = ++i;

您正在更改i,但之后继续将其用于以后的陈述。这将使您的一些元素未初始化,而其他元素将尝试在数组边界之外写入。

编辑:正如Deduplicator指出的那样,这是未定义的行为(UB)甚至在它到达下一个语句之前。您不能依赖于赋值运算符的左侧和右侧的哪个顺序进行求值,因此(例如)i++可能会发生在edges[i]部分之前。这个question有一些信息丰富的答案。

答案 1 :(得分:1)

这一行有一个错误: edges[i].id = ++i; 这里索引1处的数组元素被赋值而不是0索引处的目标元素。 将其更改为:edges[i].id = i+1;并在while循环结束时增加i