我在编译代码块后执行了这段代码: -
#include <stdio.h>
int main()
{
char arr[]="HELLO";
int a=arr;
return printf("...%s ,%s\n",arr,&a+1);
}
我得到了这个输出: - ... HELLO,HELLO
当我将&a
更改为a
时,printf返回-1。
我无法理清这个地址逻辑,请帮忙。
(一位朋友给了我这个代码,并问了解释,但我找不到它)。所以我想知道为什么..
感谢
答案 0 :(得分:10)
您告诉printf
期待一个字符串,但是您给它的地址是int
(&a
)。这会调用未定义的行为,因此任何事情都可能发生。
[实际上,可能发生的事情是编译器将a
直接放在堆栈上的arr
下面。因此&a+1
的结果与&arr
相等。 printf
然后将该地址重新解释为指向char
的指针,最终打印HELLO
。如果编译器碰巧以不同方式排列堆栈,您会发现不同的行为。]