为什么在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_tstrlen(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()的结果,其中没有像字符串那样,可能根本就没有可访问的内存。