【问题标题】:Fundamental error with C code [duplicate]C代码的基本错误[重复]
【发布时间】:2014-05-19 16:54:40
【问题描述】:

我正在为考试而学习,我遇到了这个问题:

这段代码的关键错误是什么?

int *numbers(int a, int b)
  {
     int array[2];
     array[0] = a * b;
     array[1] = a + b;
     return array;
  }

现在,我没有太多的 C 经验,但我在这段代码中根本看不到关键错误。也许我是个白痴,只是忽略了一些明显的事情。我唯一能看到的是没有使用 malloc 分配内存,但我认为这不是什么大问题。

感谢任何帮助!

【问题讨论】:

  • 函数退出时array会发生什么?这对于尝试使用此函数结果的调用者意味着什么?
  • 您返回的指针在函数返回后将失效。
  • 为什么人们会低调?
  • @CandyMan 因为它可能是重复的。不过我现在找不到链接。无论如何,无论如何,OP 都从同情投票中获益。
  • @sashoalm 好吧'可能'。在盲目投反对票之前,应该提供一些确凿的证据。

标签: c


【解决方案1】:

这里最基本的问题是,一旦numbers() 返回,array 就不再存在了。返回的指针指向的空间可能很快就会被覆盖。

【讨论】:

    【解决方案2】:

    当函数返回时,变量array会消失,但是你已经返回了一个指向它在内存中位置的指针。

    【讨论】:

      【解决方案3】:

      你基本上是在返回垃圾,因为返回后数组会超出范围。如果您将数组设为静态,一切都会好起来的。

      【讨论】:

      • 将数组设为静态是一种不当行为。由于只有一个静态数组实例在许多不同的地方调用该函数将导致指向同一内存区域的指针。函数也不会是线程安全的和可重入的。 Baaaad 练习。
      • 我同意。但只是为了争论,它会起作用。当然,在现实世界中不应该使用suck practice。
      【解决方案4】:

      如果内存是用 malloc 分配的,那么该函数将是有效的。一旦函数退出,在函数(栈)范围内分配的任何内存都不再有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        相关资源
        最近更新 更多