C %s格式用于查找字符串的地址
它应该给出错误,因为我使用了&for%s否,您的代码运行正常C %s格式用于查找字符串的地址,c,printf,C,Printf,它应该给出错误,因为我使用了&for%s否,您的代码运行正常 a是类型为char的数组。它与char* a[2]是单个char &a[2]是指向数组中第三个字符的字符*。它相当于a+2 否,您的代码运行正常 a是类型为char的数组。它与char* a[2]是单个char &a[2]是指向数组中第三个字符的字符*。它相当于a+2 它不应该给出错误-代码中的printf工作正常 您不能仅查看&运算符的地址,并确定它生成的结果无效,因为表达式的其余部分也很重要。在您的例子中,&运算符应用于a[2
是类型为a
的数组。它与char
char*
是单个a[2]
char
是指向数组中第三个字符的&a[2]
。它相当于字符*
a+2
是类型为a
的数组。它与char
char*
是单个a[2]
char
是指向数组中第三个字符的&a[2]
。它相当于字符*
a+2
&
运算符的地址,并确定它生成的结果无效,因为表达式的其余部分也很重要。在您的例子中,&
运算符应用于a[2]
,因此它采用字符串中第三个字符的地址。这是有效的,只要以null结尾的字符串至少有两个字符,而字符串则有两个字符
t organized learn c!
如您所见,
a
和&a[2]
都指向有效的以null结尾的C字符串。在您的情况下,字符串重叠,但C并不禁止它。它不应该给出错误-代码中的printf工作正常
您不能仅查看&
运算符的地址,并确定它生成的结果无效,因为表达式的其余部分也很重要。在您的例子中,&
运算符应用于a[2]
,因此它采用字符串中第三个字符的地址。这是有效的,只要以null结尾的字符串至少有两个字符,而字符串则有两个字符
t organized learn c!
如您所见,
a
和&a[2]
都指向有效的以null结尾的C字符串。在您的情况下,字符串重叠,但C并不禁止它。错误并不是您所期望的:
- 没有参数的
的原型应该是main
intmain(void)
- 对于良好的样式,
应显式返回0main
- 对于转换说明符
,%s
需要指向以null结尾的字符串的指针printf
是&a[2]
中第三个字节的地址,它是指向a
的有效a
指针,即指向以null结尾的字符串char
“t!”
a+2
或2+a
甚至&2[a]
get organized learn c!\0
^ ^ ^
| | +- null terminator
| +---------------------- &a[2] points here
+------------------------ a, interpreted as a pointer, points here
#包括
内部主(空){
char a[]=“组织起来学习c!”;
printf(“%s\n”,&a[2]);
返回0;
}
错误不在您预期的范围内:
- 没有参数的
的原型应该是main
intmain(void)
- 对于良好的样式,
应显式返回0main
- 对于转换说明符
,%s
需要指向以null结尾的字符串的指针printf
是&a[2]
中第三个字节的地址,它是指向a
的有效a
指针,即指向以null结尾的字符串char
“t!”
a+2
或2+a
甚至&2[a]
get organized learn c!\0
^ ^ ^
| | +- null terminator
| +---------------------- &a[2] points here
+------------------------ a, interpreted as a pointer, points here
#包括
内部主(空){
char a[]=“组织起来学习c!”;
printf(“%s\n”,&a[2]);
返回0;
}
为什么您认为应该出现错误?“%s”
格式需要一个指针。指向以零结尾的char
元素字符串的指针。这就是你的论点。为什么您认为应该出错?为什么您认为应该出错?“%s”
格式需要一个指针。指向以零结尾的char
元素字符串的指针。这就是你的论点。为什么您认为应该出现错误?代码工作正常。:除了void main()
;-)@没错,生活中总会有一些健康的UB:-)代码工作正常。:除了void main()
;-)@chqrlie是的,一些健康的UB在生活中总是有一席之地:-)应该返回0
是返回退出(成功
?@EdHeal:行为应该基本相同:main
的返回值被当作EXIT()
状态被调用:最后,控件返回到主机环境。如果status
的值为零或EXIT\u SUCCESS
,则返回状态成功终止的实现定义形式。如果status
的值为EXIT\u FAILURE
,则返回状态unsuccessful termination的实现定义形式。否则返回的状态是由实现定义的。是否应该return 0
bereturn EXIT\u SUCCESS
?@EdHeal:行为应该基本相同:main
中的返回值被当作EXIT()
已被作为其status
参数调用:最后,控件返回到主机环境。如果status
的值为零或EXIT\u SUCCESS
,则返回状态成功终止的实现定义形式。如果status
的值为EXIT\u FAILURE
,则返回状态unsuccessful termination的实现定义形式。否则,返回的状态是实现定义的。