加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组作为scanf的函数参数.地址操作符

发布时间:2020-12-16 10:11:08 所属栏目:百科 来源:网络整理
导读:#include stdio.hint main(void){ char s[32];example_1: scanf("%s",s); printf("%sn",s);example_2: scanf("%s",s[0]); printf("%sn",s);example_3: scanf("%s",s); printf("%sn",s);} 为什么#3与其他2的工作方式相同? #3有效吗?为什么? 解决方法 变
#include <stdio.h>

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

example_1:
  scanf("%s",s);
  printf("%sn",s);

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

example_3:
  scanf("%s",&s);
  printf("%sn",s);
}

>为什么#3与其他2的工作方式相同?
>#3有效吗?为什么?

解决方法

>变体1取决于 array decay,因此是有效的.

(在大多数情况下,数组衰减指向它们的第一个元素,例外是:地址 – (& s),sizeof s,_Alignas(s)和_Alignof(s).)
>变量2可以手动执行数组衰减,更加冗长,因此更糟糕.
>变体三是严格的Undefined Behavior,虽然它恰好适用于大多数实现.
关键点是,在默认促销之后,& s不是char *类型,尽管它指向正确的地址.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读