【问题标题】:C++ Struct pointers in linked list implementation链表实现中的 C++ 结构指针
【发布时间】:2023-03-31 02:02:01
【问题描述】:

谁能帮忙解决这个问题(我猜是指针和内存分配问题——在运行时,如果我删除了结构数据结构 E 的 //COMMENTED// cout statement 两个 *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);
}

【问题讨论】:

  • 停止大喊大叫,添加适当的缩进,并使用代码块而不是 stack-sn-p(那些用于 HTML+CSS+JS)!你可以edit它。

标签: c++ pointers struct linked-list


【解决方案1】:

看到这一行

edges[i].id = ++i;

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

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

【讨论】:

  • 怎么样?如果您的意思是因为i 在此语句中使用之前已更改,为什么不这么说呢?如果你的意思是别的,为什么不这么说呢?编辑:啊,我看到你在评论中添加了“UB”,没关系。
  • 该语句是 UB,即使它以 i == 0 执行并且边至少有 2 个元素大。
  • 谢谢.. 我能够解决这个问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 2013-02-13
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多