任何人都可以帮忙解决这个问题(我猜是指针和内存分配问题 - 在运行时,如果删除//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);
}
答案 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
。