将地址传递给数组而不是数组会导致问题吗?

klu*_*utt 9 c arrays

我遇到了这段代码:

char str[600];
scanf("%s", &str);
Run Code Online (Sandbox Code Playgroud)

当然,这会发出此警告:

a.c:6:17: warning: format specifies type 'char *' but the argument has type
      'char (*)[600]' [-Wformat]
    scanf("%s", &str);
           ~~   ^~~~~~~
Run Code Online (Sandbox Code Playgroud)

我知道正确的方法是删除&和键入scanf("%s", str).但它确实有效,所以我的问题是这是否会导致任何问题.是UB吗?当我切换str到指针而不是数组时(显然)不起作用.但是这会在使用数组时引起任何问题吗?

(我在这里讨论了一个答案,答案者不想改变他对正确方法的回答)

M.M*_*M.M 8

是的,代码是未定义的行为.对应的参数%s必须具有类型char *.这在说明书C17 7.21.6.2/12中有描述s:

[...]相应的参数应该是一个指向大小足以接受序列的字符数组的初始元素的指针,以及一个自动添加的终止空字符.

它相当清楚地表明指针应该具有指向字符的类型,而不是指向整个数组.

未定义的行为意味着任何事情都可能发生.它可能表现得好像你省略了&,或者它可能会格式化你的硬盘.

鉴于在这种情况下很容易避免未定义的行为,我真的没有理由去讨论在这种情况下依赖于未定义行为的行为是否可行.