Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C %s格式用于查找字符串的地址_C_Printf - Fatal编程技术网

C %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

它应该给出错误,因为我使用了&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]
,因此它采用字符串中第三个字符的地址。这是有效的,只要以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)

  • 对于良好的样式,
    main
    应显式返回0

  • 对于转换说明符
    %s
    printf
    需要指向以null结尾的字符串的指针
    &a[2]
    a
    中第三个字节的地址,它是指向
    a
    的有效
    char
    指针,即指向以null结尾的字符串
    “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)

  • 对于良好的样式,
    main
    应显式返回0

  • 对于转换说明符
    %s
    printf
    需要指向以null结尾的字符串的指针
    &a[2]
    a
    中第三个字节的地址,它是指向
    a
    的有效
    char
    指针,即指向以null结尾的字符串
    “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
be
return EXIT\u SUCCESS
?@EdHeal:行为应该基本相同:
main
中的返回值被当作
EXIT()
已被作为其
status
参数调用:最后,控件返回到主机环境。如果
status
的值为零或
EXIT\u SUCCESS
,则返回状态成功终止的实现定义形式。如果
status
的值为
EXIT\u FAILURE
,则返回状态unsuccessful termination的实现定义形式。否则,返回的状态是实现定义的。