有人能帮我解决这个问题吗(我猜是指针和内存分配问题——在运行时,如果我删除//COMMENTED// cout statement
,代码就不起作用。结构数据结构E的两个*in
和*out
虽然以相同的方式处理,但只有*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);
}
参见
edges[i].id = ++i;
您正在更改i
,但在以后的语句中继续使用它。这将使您的一些元素未初始化,而其他元素将尝试在数组边界之外进行写入。
编辑:正如重复数据删除器所指出的,这是未定义的行为(UB),甚至在它进入下一个语句之前。不能依赖赋值运算符的左手边和右手边的求值顺序,因此(例如)i++
可能发生在edges[i]
部分之前。这个问题有一些有用的答案。
此行有一个错误:edges[i].id = ++i;
这里,索引1处的数组元素被赋值,而不是索引0处的预期元素。将其更改为:edges[i].id = i+1;
,并在while循环结束时递增i
。