【问题标题】:Declaration mistake in C with return value带有返回值的 C 中的声明错误
【发布时间】:2019-07-25 03:04:42
【问题描述】:

这种声明在 C 中的错误是否有原因?

short foo()
{
   short x,y,z;
   y=24;
   z = x + y;
   return z; 
}

【问题讨论】:

    标签: c memory memory-leaks return declaration


    【解决方案1】:

    声明没有错本身,但是代码有问题:

    • 在现代 C 中,short foo(void) 优于 short foo()。前者说该函数不带参数。后者使其具有灵活性,这涉及许多可能导致错误发生的问题。
    • z = x + y; 中,x 没有被赋值。然后代码的行为是未定义的。 (这是由于一个特殊规则,即使用具有自动存储持续时间且既没有被赋予值也没有被占用其地址的对象具有 C 标准未定义的行为。)

    【讨论】:

      【解决方案2】:

      z 的返回值将是未定义的行为,因为您没有在此函数中初始化 x 变量的值。这个函数的返回值会不一致,有时是24,有时是另一个值。

      【讨论】:

      • 它比 z 更糟糕,只是具有未指定的值。根据 C 2018 6.3.2.1 2,C 标准未定义整个行为:z 可以有任何值,可能会发生陷阱,可以在优化期间删除对函数的调用等等。
      • 那么在这种情况下,将函数签名更改为 short foo(short x) 并将 x 作为堆栈变量删除应该可以解决问题吗?
      • @JDoe 是的。你可以这样做。 x 将从函数 foo 的堆栈中删除。调用者将控制x 变量本身。调用者也需要初始化x
      • short foo(short a) { short b,c; b=10; c = a + b;返回 c; } 所以这不会有错误。
      猜你喜欢
      • 2020-12-07
      • 2019-04-06
      • 2017-12-15
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2015-02-24
      • 1970-01-01
      相关资源
      最近更新 更多