【问题标题】:C's Undefined Behaviour [duplicate]C的未定义行为[重复]
【发布时间】:2015-11-09 14:06:47
【问题描述】:

我有这个代码:

#include <stdio.h>
#include <math.h>
int *fun();
int main()
{
    int *t;
    t=fun();
    printf("%d\n",*t);
    printf("%d\n",*t);
}
int *fun()
{
    int r=95;
    return(&r);
}

这段代码在代码块中显示的输出是

95
-2

我不明白为什么第二个printf() 正在打印垃圾值。有人可以解释一下吗?

【问题讨论】:

  • 使用原型声明器!并启用编译器警告。
  • 通过编辑int fun() --> int *fun() 在答案指出缺陷后,否定答案的价值。最好 1) 恢复编辑。 2) 如果需要,附加注释,承认该问题并需要继续帮助。
  • 请告诉我们您在编译时收到了什么警告。

标签: c function pointers


【解决方案1】:

这是UB,因为rfun()内部的一个局部变量,如果你返回一个局部变量的地址并尝试在调用者中使用它,你最终会在is过期后使用它这是一生。在C中定义为UB。

FWIW,变量的地址并不总是等价于int,或者可以安全地转换为指针,因此至少应该是int *。在您的代码中,

t=fun();

return(&r);

应该给你警告!!

【讨论】:

  • 另外,将指针返回为int 是不好的。
  • @MikeCAT 是的,对。
  • 实际上应该是。 port70.net/~nsz/c/c11/n1570.html#6.3.2.3p6 。只有两个安全整数是(u)intptr_t
  • @Olaf 对此进行了一些澄清。 :)
【解决方案2】:
  1. 你从fun返回一个int*,即使它被声明为返回int。将声明更改为int* fun()

  2. An empty list allows a variable number of arguments。请改用int* fun(void);

  3. 未定义的行为是未定义的行为。你尝试access memory of a local variable from outside the function,所以任何事情都可能发生。从 C 标准的级别来看,第一个、第二个或根本没有语句的行为是否怪异(如“打印垃圾值”)显然是未定义

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2019-05-04
    • 2014-11-21
    • 2017-02-15
    相关资源
    最近更新 更多