为什么在C中使用错误的格式说明符会使我的程序在Windows 7上崩溃?
我的节目如下;
#include #include int main() { char string[] = "Gentlemen start your engines!"; printf("That string is %s characters long.\r\n", strlen(string)); return 0; }
我正在gcc下编译,虽然它没有给我任何错误,程序每次运行时都会崩溃。 从我见过的例子来看,代码似乎很好。 很高兴知道我做错了什么。
谢谢。
在printf()
使用不正确的格式说明符调用未定义的行为。 正确的格式说明符应该是%zu
(而不是%d
),因为strlen()
的返回类型是size_t
注意: %zu
长度修饰符z
表示与size_t
相同的长度整数
你有错误的格式说明符。 %s
用于字符串,但是您传递的是size_t
( strlen(string)
)。 在printf()
使用不正确的格式说明符会调用未定义的行为 。 请改用%zu
因为strlen()
的返回类型是size_t
。
所以改变
printf("That string is %s characters long.\r\n", strlen(string));
至:
printf("That string is %zu characters long.\r\n", strlen(string));
由于您正在使用gcc
查看此处以获取有关可传递给printf
更多信息
printf("That string is %d characters long.\r\n", strlen(string));
代替:
printf("That string is %s characters long.\r\n", strlen(string));
你在这里有一个问题printf("That string is %s characters long.\r\n", strlen(string));
放
printf("That string is %d characters long.\r\n", strlen(string));
%d因为你要打印str的长度(strlen返回数字)
程序崩溃,因为格式化例程尝试访问地址0x0000001D
处的字符串,这是strlen()
的结果,其中没有像字符串那样,可能根本就没有可访问的内存。