#include<stdio.h>
void main()
{
char a[]="get organized learn c!";
printf("%s",&a[2]);
}
我得到了输出:
t organized learn c!
它应该给出错误,因为我使用&amp;对于%s
答案 0 :(得分:4)
不,您的代码表现正常。
a
是char
类型的数组。它与char *
a[2]
是一个char
&a[2]
是char *
,指向数组中的第三个字符。它相当于a + 2
。答案 1 :(得分:1)
它不应该出错 - 代码中的printf正常工作。
您无法单独查看&
运算符的地址,并确定其生成的结果无效,因为表达式的其余部分也很重要。在您的情况下,&
运算符应用于a[2]
,因此它采用字符串中第三个字符的地址。这是有效的,只要您的以null结尾的字符串至少包含两个字符,而字符串就是这样。
get organized learn c!\0
^ ^ ^
| | +- null terminator
| +---------------------- &a[2] points here
+------------------------ a, interpreted as a pointer, points here
如您所见,a
和&a[2]
都指向有效的以null结尾的C字符串。在你的情况下,字符串重叠,但C不禁止它。
答案 2 :(得分:0)
错误不在您预期的位置:
main
没有参数的原型应为int main(void)
对于好的风格,main
应该明确返回0。
对于转换说明符%s
,printf
需要一个指向空终止字符串的指针。 &a[2]
是a
中第三个字节的地址,它是char
的有效a
指针,即空终止字符串"t organized learnc!"
,没有错误这里。
您可以将a + 2
或2 + a
或&2[a]
写成具有相同的确切含义。
#include <stdio.h>
int main(void) {
char a[] = "get organized learn c!";
printf("%s\n", &a[2]);
return 0;
}