【发布时间】:2020-09-26 13:56:25
【问题描述】:
#include <stdio.h>
int *m() {
int *p = 5;
return p;
}
void main() {
int *k = m();
printf("%d", k);
}
答案即将到来5。
有人能解释一下答案是怎么来的5吗?
我试图解决它,但无法理解它是如何工作的。
【问题讨论】:
-
@goodvibration 使用
%d打印指针是... -
@goodvibration
printf()是绝对未定义的行为。 C11 标准草案 n1570:7.21.6 格式化输入/输出函数 7.21.6.1 fprintf 函数 [...] 8 转换说明符及其含义为: d,i int 参数 [...] 9 如果 a转换规范无效,行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。 和 7.21.6.3 printf 函数 [...] 2 printf 函数等效于带有参数 stdout 的 fprintf插入 printf 的参数之前。 -
它也在标题中提出一个问题,在正文中提出一个不同的问题,并且没有表现出任何努力。无论如何,我在写这篇文章时没有看到任何反对意见,但我认为 UB 狼不会是任何出现的唯一合理的解释。
-
未定义的行为是未定义的。可以对无用的问题投反对票。
-
@goodvibration 显然你不明白什么是未定义的行为。