【问题标题】:C, last element of the list pointing on nothingC,列表的最后一个元素指向空
【发布时间】:2013-07-18 23:45:45
【问题描述】:

我有一个问题:如果指针列表相等,则以下函数会在第二个中复制指针列表。 外汇 list1 = 1 2 3 3 5 6 7 7 7

调用后的结果是:

list2 = 3 7

node *seqdup(node *lis)
{
    if(lis == NULL)
        return NULL;
    else if (lis->next != NULL)
        {
            if(lis->data == lis->next->data)
                {
                    node *p;
                    p = newnode();
                    p->data = lis->next->data;
                    p->next = seqdup(lis->next);
                    return p;
                }
            else
                return seqdup(lis->next);
        }
}

我知道这是一个没用的功能,它是用于学校考试的。

它的问题是: 我为学校作业做的,在 10 分中总共得到 2 分,因为不包括诸如“if (lis->next == NULL) return NULL;”之类的条件。 由于在读取列表的最后一个节点时,该函数什么也不做: fx if the lis is 1 1 3 4

对于第一个节点,lis->next != NULL 他发现 1 == 1` 所以复制到 lis 2 对于第二个,lis->next != NULL,和 1 != 3,所以 rec 调用,但没有副本 然而,第三个,因为 3 != 4,它什么也不做

问题是,只要我在递归调用之后分配 lis->next,第二个列表的最后一个复制节点基本上会指向一个什么都不做的函数。

显然,我的老师对这个问题的严厉态度是正确的,因为有很多简单的方法可以解决它。然而,我的问题是:为什么它仍然有效?

试图把它写下来并编译它,就像一个魅力:/

【问题讨论】:

  • 澄清一下:你问的是“我的函数为什么会在通过没有明确return 的代码路径时返回NULL?”
  • 类似的东西是的。运行该函数后,我使用打印函数遍历返回的列表(只要 lis != NULL 打印数据字段),一切正常。

标签: c list pointers recursion linked-list


【解决方案1】:

如果它对你有用,那只是意味着你很幸运,当条件失败时,eax 寄存器恰好为零。所以就好像你在函数的末尾有一个return NULL

当我在我的编译器中测试它时,情况并非如此,并且代码不起作用。对我来说,eax 寄存器保存了 lis 的值,所以就好像函数末尾有 return lis。这只是产生了一个永远循环的列表。

【讨论】:

  • 我明白了:实际上这就是我想的原因,这基本上是运气的问题。但与此同时,这很奇怪,因为我尝试运行该函数 150.000 次(用另一个函数调用它)并且没有任何问题。顺便说一句:我是在说什么愚蠢的话,请原谅我,我一般是编程新手(今年开始上大学,来自一所编码不是一门学科的学校)。但是,我确实知道这个问题是 C 的典型问题,声明一个变量不会将其设置为未知(或者至少他们是这样解释的)。就像声明 int a;并打印出来。
  • @Eloh666 能否工作的问题主要是在编译时决定的,而不是在运行时决定的。如果编译器生成的汇编代码在函数中的那个点将 eax 寄存器设置为零,它总是可以工作的。如果它生成的代码将 eax 寄存器设置为其他值,它几乎总是会失败。多次运行它不太可能改变任何东西。使用不同的编译器或稍微更改代码会产生不同的结果。
  • 我明白了,并没有真正想到这一点,但它确实很有意义。谢谢!
  • 一个很好的例子,说明为什么你永远不应该依赖未定义的行为。它会导致你得出错误的结论。
  • 我知道,真的。问题是知道它不应该工作,它仍然工作,这让我想知道。起初我确实认为这是对编译器的优化,但是注册表选择解释非常有意义。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2010-11-13
  • 2012-12-25
  • 2022-01-07
  • 2018-03-10
  • 2014-06-15
相关资源
最近更新 更多