c - 正在使用未初始化变量 UB 的地址吗?

标签 c printf undefined-behavior variadic-functions

<分区>

这个小代码是UB吗?

void Test()
{
  int bar;
  printf("%p", &bar);  
}

IMO 这不是 UB,但我想听听其他意见。

它只是打印bar 的地址,即使bar 从未被初始化。

最佳答案

TL:DR 不,您的代码不会像您想象的那样通过使用任何未初始化的东西来调用 UB。


a(ny) 变量(自动,在本例中)的地址有一个定义值,所以不管变量本身是否被初始化,变量的地址都是一个< em>定义值。您可以利用该值。 (如果您不处理指针和进行双重解引用。:))

也就是说,严格来说,你应该写

 printf("%p", (void *)&bar);

as %p 期望指向 voidprintf() 的类型指针参数是可变参数函数,没有提升(转换)被执行。否则,这是一个明确定义的行为。

C11,章节 §7.21.6.1

p The argument shall be a pointer to void. [.....]

关于c - 正在使用未初始化变量 UB 的地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39918506/

相关文章:

PHP:如何通过 sprintf() 添加前导零/零填充以 float ?

c++ - 为什么像 "a[i] = i++;"这样的增量操作会导致未定义的行为?

c++ - 什么是悬空引用?

c - 如何让一个进程休眠几毫秒

c - 为正整数找到 2 的质因数分解的最有效方法

c - 如何证明 C 语句 -x、~x+1 和 ~(x-1) 产生相同的结果?

c++ - 通过 printf 函数打印带有 %u 说明符的 unsigned char 是否安全?

c++ - Printf 和 C++ 字符串

c - 为什么我的变量在 strtok() 和 fgets() 之后改变而不修改它?

c - 是否可以编写一个可以在 C 中转储任意维 int 数组的函数?