C 为什么会有这样的产出

C 为什么会有这样的产出,c,pointers,C,Pointers,我在编译代码块后执行了以下代码:- #include <stdio.h> int main() { char arr[]="HELLO"; int a=arr; return printf("...%s ,%s\n",arr,&a+1); } #包括 int main() { char arr[]=“你好”; INTA=arr; 返回printf(“…%s,%s\n”,arr,&a+1); } 我得到了这个输出:- …你好,你好 当我

我在编译代码块后执行了以下代码:-

#include <stdio.h>
int main()
{
    char arr[]="HELLO";   
    int a=arr;    
    return printf("...%s ,%s\n",arr,&a+1);
}
#包括
int main()
{
char arr[]=“你好”;
INTA=arr;
返回printf(“…%s,%s\n”,arr,&a+1);
}
我得到了这个输出:- …你好,你好

当我将
&a
更改为
a
时,printf返回-1。 我无法整理此地址逻辑,请帮助。 (一位朋友给了我这段代码并要求解释,但我找不到)。所以我想知道为什么。。
谢谢

您告诉
printf
需要一个字符串,但您给它的地址是
int
&a
)。这会调用未定义的行为,因此任何事情都可能发生


[在实践中,可能发生的情况是编译器将
a
直接放在堆栈上
arr
的下方。因此
&a+1
的值最终等于
&arr
printf
,然后将该地址重新解释为指向-
char
的指针,并最终打印
HELLO
如果要以不同的方式排列堆栈,您会观察到不同的行为。]

您想实现什么?只是想知道为什么会发生这种情况,因为我对c语言不熟悉……由于这种未定义的行为,导致堆栈溢出也就不足为奇了。/punAs我认为,如果a低于arr,那么就向“a”添加一个值将让它在堆栈中向下生长,这可能不是arr。那么我如何获取arr的地址(如果错误,请更正我)@Kislay:向指针添加1总是会使其地址增加。