为什么在 C 中使用错误的格式说明符会使我的程序在 Windows 7 上崩溃?
我的程序如下;
#include <stdio.h>
#include <string.h>
int main()
{
char string[] = "Gentlemen start your engines!";
printf("That string is %s characters long.\r\n", strlen(string));
return 0;
}
我在 gcc 下编译,虽然它没有给我任何错误,但每次运行它时程序都会崩溃。从我见过的例子来看,代码似乎没问题。很高兴知道我是否做错了什么。
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
在
printf()
中使用不正确的格式说明符会调用未定义的行为。正确的格式说明符应该是%zu
(而不是%d
),因为strlen()
的返回类型是size_t
注意:
%zu
中的长度修饰符z
表示与size_t
长度相同的整数Using incorrect format specifier in
printf()
invokes Undefined Behaviour. Correct format specifier should be%zu
(not%d
) because the return type ofstrlen()
issize_t
Note: Length modifier
z
in%zu
represents an integer of length same assize_t
您的格式说明符错误。
%s
用于字符串,但您传递的是size_t
(strlen(string)
)。在printf()
中使用不正确的格式说明符会调用未定义的行为。请改用
%zu
,因为strlen()
的返回类型为size_t
。因此更改
为:
由于您使用的是
gcc
,请查看 此处了解可以传递给printf
的更多信息You have wrong format specifier.
%s
is used for strings but you are passingsize_t
(strlen(string)
). Using incorrect format specifier inprintf()
invokes undefined behaviour.Use
%zu
instead because the return type ofstrlen()
issize_t
.So change
to:
Since you are using
gcc
have a look here for more info what can be passed toprintf
反而:
instead:
你这里有问题
printf("该字符串的长度为 %s 个字符。\r\n", strlen(string));
put
printf("该字符串的长度为 %d 个字符。\r\n" , strlen(字符串));
%d 因为你想打印 str 的长度(strlen 返回数字)
You have a problem here
printf("That string is %s characters long.\r\n", strlen(string));
put
printf("That string is %d characters long.\r\n", strlen(string));
%d because you want to printthe length of str (strlen returns number)
程序崩溃是因为格式化例程尝试访问地址
0x0000001D
处的字符串,该字符串是strlen()
的结果,其中与字符串完全不同,并且可能根本没有可访问的内存。Program crashes because formatting routine tries to access a string at address
0x0000001D
which is the result ofstrlen()
where is nothing like a string and likely there's no acessible memory at all.