char *x = "world";
x = &x[6];
printf("%s", x);
您好我无法理解为什么上面的代码输出了printf语句中的第一个参数。如果我将其更改为printf("f%s",x);
,则输出“ff%s”为什么输出ff两次?
谢谢
答案 0 :(得分:4)
因为您正在读取数组边界之外的内容。你的数组长度为6(0-5),你正在访问第6个成员(你的最后一个成员是第5个成员)。这是一个未定义的操作,并且会执行不可预测的事情,比如打印出printf语句的部分。
答案 1 :(得分:3)
重合。这是未定义的行为。你正在解决错误的记忆。
&x[6]
相当于&(*(x+6))
。即你正在寻找字符串的结束值'\0'
之后,似乎字符串"s%"
从那里开始。
答案 2 :(得分:1)
因为格式字符串在"world"
之后立即存储在read only data section中,所以
x = &x[6];
现在x
指向格式字符串。
这只是一个巧合,在实践中应该不可能预测该程序的输出,但事实证明有一种方法可以将程序安排在内存中以及那种方式的知识,允许有人写这样的有趣的代码。
此
char *x = "";
x = &x[1];
例如,不会导致相同的行为,但任何超过0
个字符的行为都会。