数组作为scanf的函数参数.地址运营商

Hig*_*tor 3 c arrays pointers scanf variadic-functions

#include <stdio.h>

int main(void)
{
  char s[32];

example_1:
  scanf("%s", s);
  printf("%s\n", s);

example_2:
  scanf("%s", &s[0]);
  printf("%s\n", s);

example_3:
  scanf("%s", &s);
  printf("%s\n", s);
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么#3与其他2的工作方式相同?

  2. #3有效吗?为什么?

Ded*_*tor 9

  1. 变体1取决于阵列衰减,因此是有效的.

    (在大多数情况下,数组衰减到指向第一个元素的指针,例外是:Address-of(&s)sizeof s,_Alignas(s)_Alignof(s).)

  2. 变体2可以手动执行数组衰减,并且更加冗长,因此更糟糕.

  3. 变体3是严格的未定义行为,但它恰好适用于大多数实现.虽然它指向了正确的地址,但是在默认促销之后
    ,这&s一点并不属于类型char*.

似乎工作是UB中最危险的子集.